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
相关产品推荐
相关产品推荐

