关于时间转换 SimpleDateFormat 的使用的问题

2,482 阅读2分钟

最近一段时间在做一个项目,项目中使用了大量的额时间格式转换,为了方便,就提取了一个时间操作的工具类,由于使用过于频繁,且处于压力测试,每个不到三秒,甚至毫秒级的去调用时间工具类里的转换方法时,从后台服务器查到,上传的时间偶发性的异常,就是时间竟然格式不对了,竟然出现了 0001-02-22 12:30:26 的情况,我屮艸芔茻,这是什么情况,怎么时间回到了古代,公元1年?

当时,我就怀疑,是不是操作过于频繁,线程不安全导致的?为此,修改了调用方式。果然,效果显著,竟然压力测试几天,时间转换错误不再出现了。看来确实是这个情况。当时,错误出现时,我用的是把 SimpleDateFormat 提取成全局变量,是 static 变量,在全局中直接先 new 好。这样的处理方式是不行的。

今天,我在查看阿里巴巴 Java 技术开发手册时,竟然看到了里面也有这方面的知识,果然,大公司就是考虑周到,竟然在开发手册的并发处理中说到了 SimpleDateFormat 的使用。手册里是这么说的:

SimpleDateFormat 是线程不安全的类,一般不要定义为 static 变量,如果定义为 static,必须加锁,或者使用 DateUtils 工具类。

而阿里巴巴推荐使用的方式如下:

正例:注意线程安全,使用 DateUtils。亦推荐如下处理:

private static final ThreadLocal<DateFormat> df = new ThreadLocal<DateFormat>() { 
        @Override
        protected DateFormat initialValue() {
            return new SimpleDateFormat("yyyy-MM-dd");
        } 
};

说明:如果是 JDK8 的应用,可以使用 instant 代替 Date,Localdatetime 代替 Calendar, Datetimeformatter 代替 Simpledateformatter,官方给出的解释:simple beautiful strong immutable thread-safe。

最后,在小密圈分享这个小知识点,希望能够对大家有所帮助,以后不会犯跟我一样的错误。

在这里强烈推荐大家看看阿里巴巴 Java 技术开发手册,没多少也就30多页,真的能够让你们收益颇丰。

欢迎大家关注我的技术分享公众号:非著名程序员(smart_android)。技术文章均先首发于我的技术分享的微信公众号。