SimpleDateFormat格式化时间的安全问题解决方法

Posted 芝麻_糊

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SimpleDateFormat格式化时间的安全问题解决方法相关的知识,希望对你有一定的参考价值。

问题:

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

而且SimpleDateFormat 中的parse(String str)解析时不能为 "",否则会有ParseException

解决方法:

[正例]:

1.注意线程安全,使用DateUtils。

2.亦推荐如下处理:

 1 private static final ThreadLocal<DateFormat> df = new ThreadLocal<DateFormat>() {      
 2 
 3  @Override       
 4 
 5 protected DateFormat initialValue() {           
 6 
 7 return new SimpleDateFormat("yyyy-MM-dd");       
 8 
 9 }   
10 
11 };   

3.说明:如果是JDK8的应用,可以使用Instant代替DateLocalDateTime代替CalendarDateTimeFormatter代替Simpledateformatter,官方给出的解释:simple beautiful strong immutable thread-safe

[正例]

System.out.println(LocalDate.of(2017, 6, 7));

System.out.println(LocalTime.of(3, 20, 15));

System.out.println(LocalDateTime.of(2017, 6, 7,3, 20, 15));

System.out.println(Instant.now().atOffset(ZoneOffset.ofHours(8)));

返回结果:

2017-06-07

03:20:15

2017-06-07T03:20:15

2017-06-07T11:37:15.815+08:00

有篇文章分析的不错http://www.cnblogs.com/peida/archive/2013/05/31/3070790.html

以上是关于SimpleDateFormat格式化时间的安全问题解决方法的主要内容,如果未能解决你的问题,请参考以下文章

SimpleDateFormat时间格式化存在线程安全问题

还在用 SimpleDateFormat 做时间格式化?小心项目崩掉!

深入理解Java:SimpleDateFormat安全的时间格式化 ;

深入理解Java:SimpleDateFormat安全的时间格式化

SimpleDateFormat格式化时间的安全问题解决方法

SimpleDateFormat线程不安全的5种解决方案!