不是,非常不幸,DatePormat 的所有实现,包括 SimpleDateFormat 都不是线程安全的,因此你不应该在多线程程序中使用,除非是在对外线程安全的环境中使用,如将 SimpleDateFormat 限制在 ThreadLocal 中。如果你不这么做,在解析或者格式化日期的时候,可能会获取到一个不正确的结果。
在多线程下可以使用 ThreadLocal 修饰 SimpleDateFormart, Threadlocal 可以确保每个线程都可以得到单独的一个 SimpleDateFormat 的对象,那么就不会存在竞争问题。
java 8 中引入新的日期类 API,这些类是不可变的,且线程安全的。
以后面试官再问项目中怎么使用日期转换的,尽量就不要说SimpleDateFormat 了。
如果是 JDK8 的应用:
可以使用 Instant 代替 Date, LocalDateTime 代替 Calendar,DateTimeFormatter 代替 SimpleDateFormat,官方给出的解释:simple beautiful strong immutable thread-safe。
日期转换,SimpleDateFormat 固然好用,但是现在我们已经有了更好地选择。Java 8 引入了新的日期时间 API,并引入了线程安全的日期类,一起来看看。
1、 Instant:瞬时实例。
2、LocalDate:本地日期,不包含具体时间例如:2014-01-14 可以用来记录生日、纪念日、加盟日等。
3、 LocalTime:本地时间,不包含日期。
4、LocalDateTime:组合了日期和时间,但不包含时差和时区信息。
5、ZonedDateTime:最完整的日期时间,包含时区和相对 UTC 或格林威治的时差。

新API还引入了 ZoneOffSet 和 ZoneId 类,使得解决时区问题更为简便。
解析、格式化时间的 DateTimeFormatter 类也进行了全部重新设计。

Was this helpful?

0 / 0

发表回复 0

Your email address will not be published.