秒级时间差场景下日期格式化工具无法正确生成字符串问题
问题分析与解决:格式化日期时时间差消失的问题
你遇到的这个问题其实是一个非常典型的「参数误用」小bug,我来帮你拆解一下:
问题根源
你看一下getFormattedDate方法的实现——你没有格式化传入的date参数,反而每次都格式化了一个新创建的new Date()!
原方法代码里的这一行是罪魁祸首:
return dateFormat.format(new Date());
因为你两次调用getFormattedDate的时间间隔几乎可以忽略不计,所以两次格式化的都是同一个「当前系统时间」,自然输出的字符串完全相同。而直接打印Date对象时,你输出的是提前计算好的currDate和nextPointDate,所以时间差是对的。
修复方案
只需要把格式化的对象改成传入的date参数即可,修正后的方法如下:
public static String getFormattedDate(Date date, String pattern) { DateFormat dateFormat = new SimpleDateFormat(pattern); return dateFormat.format(date); // 这里改用传入的date参数 }
修改后再运行你的测试代码,第二行输出就会显示正确的2019-03-19 14:57:50, 2019-03-19 14:58:50了。
额外小建议
如果你的项目使用Java 8及以上版本,更推荐使用线程安全的DateTimeFormatter来替代SimpleDateFormat,避免多线程环境下可能出现的并发问题,示例代码如下:
public static String getFormattedDate(Date date, String pattern) { return DateTimeFormatter.ofPattern(pattern) .format(date.toInstant().atZone(ZoneId.systemDefault())); }
内容的提问来源于stack exchange,提问作者Jabongg
相关产品推荐
相关产品推荐

