You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java自定义DateTime类多Activity复用的实现是否存在问题?

现有DateTime实现存在的问题

你的实现可以跑通基础逻辑,但存在5个明确的问题,线上使用很容易出bug:

  • 月份取值偏差:Calendar.MONTH字段是从0开始计数的(0对应1月,11对应12月),直接拼接返回的话,所有月份都会比真实月份小1,比如1月会显示成0月。
  • 格式不统一无补零:日期、小时、分钟为个位数时不会自动补前导零,会出现5/0/2024 9:5这类不规范的展示结果,后续如果要做时间解析也容易报错。
  • 小时逻辑歧义:你用的Calendar.HOUR是12小时制取值,返回范围0-11,没有配套AM/PM标识的话,无法区分上午和下午的同一时间,比如下午2点和凌晨2点都会返回2。
  • 日期时间不匹配风险:date()和time()方法各自独立创建Calendar实例取当前时间,如果你连续调用两个方法刚好跨了时间临界值(比如23:59:59调用date(),1秒后跨天调用time()),会出现日期是前一天、时间是当天0点的错配问题。
  • 类设计不合理:DateTime类没有任何成员变量,属于无状态的工具类,不需要每次使用都new一个实例,会产生无意义的内存开销。
修正参考实现
public class DateTime {
    // 统一定义格式,指定默认区域避免不同地区格式异常
    private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("dd/MM/yyyy", Locale.getDefault());
    private static final SimpleDateFormat TIME_FORMAT = new SimpleDateFormat("HH:mm", Locale.getDefault());

    // 私有构造方法,禁止实例化工具类
    private DateTime() {}

    // 静态方法直接调用,无需创建实例
    public static String getDate() {
        return DATE_FORMAT.format(new Date());
    }

    public static String getTime() {
        return TIME_FORMAT.format(new Date());
    }

    // 新增同时获取日期时间的方法,基于同一个时间戳生成,避免错配
    public static String[] getDateAndTime() {
        Date now = new Date();
        return new String[]{
                DATE_FORMAT.format(now),
                TIME_FORMAT.format(now)
        };
    }
}
调用方式调整

不需要每次new DateTime对象,直接通过类名调用静态方法即可,推荐用批量获取的方法避免错配:

String[] displayTime = DateTime.getDateAndTime();
dbHelper.insertNote(note, displayTime[0], displayTime[1], System.currentTimeMillis());
finish();

补充提示:如果你的应用最低支持Android 8.0(API 26),可以直接用官方推荐的java.time包下的LocalDate、LocalTime类替代Calendar和SimpleDateFormat,API设计更合理,也没有线程安全隐患。

内容的提问来源于stack exchange,提问作者nano tech

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 02:06:32