简而言之
缓存一个线程安全的 DateTimeFormatter
对象(不可变)。
永远不要使用 SimpleDateFormat
。 仅使用 java.time 包进行日期时间处理。
java.time
麻烦的旧日期时间类,如DateFormat
和SimpleDateFormat
现在被现代的java.time类所取代。特别是这里的DateTimeFormatter
类。
不可变对象,线程安全
java.time类被设计为不可变对象。这意味着,而不是修改对象中的任何内容,会生成一个新的独立对象。原始对象保持不变。
通过此方法和其他技术,java.time类被设计为线程安全,并有文档记录。
DateTimeFormatter
DateTimeFormatter dateTimeFormatterFullQuébec = DateTimeFormatter.ofLocalizedDateTime( FormatStyle.FULL ).withLocale( Locale.CANADA_FRENCH ) ;
您可以缓存该对象dateTimeFormatterFullQuébec
,并将其保留。
ZoneId
同样,您可以缓存ZoneId
时区对象。
以continent/region
的格式指定适当的时区名称,例如America/Montreal
,Africa/Casablanca
或Pacific/Auckland
。永远不要使用3-4个字母的缩写,如EST
或IST
,因为它们不是真正的时区,不标准化,甚至不唯一(!)。
ZoneId zoneMontréal = ZoneId.of( "America/Montreal" ) ;
然后随时使用它们,甚至跨线程。
ZonedDateTime zdt = ZonedDateTime.now( zoneMontréal ) ;
String output = zdt.format( dateTimeFormatterFullQuébec ) ;
2018年3月4日,美国东部标准时间下午6:36:32
java.time对象(如ZonedDateTime
和Instant
)也与ZoneId
和DateTimeFormatter
一样是不可变的和线程安全的。您可以将它们缓存起来,并在多个线程中使用。
关于 java.time
java.time 框架内置于 Java 8 及更高版本。这些类替代了老旧的 遗留 日期时间类,如 java.util.Date
、Calendar
和 SimpleDateFormat
。
Joda-Time 项目现在处于 维护模式,建议迁移到 java.time 类。
要了解更多信息,请参阅 Oracle 教程。并搜索 Stack Overflow 获取许多示例和解释。规范为 JSR 310。
您可以直接与数据库交换 java.time 对象。使用符合 JDBC 4.2 或更高版本的 JDBC 驱动程序。不需要字符串,也不需要 java.sql.*
类。
如何获取 java.time 类?
ThreeTen-Extra项目通过添加额外的类扩展了java.time。该项目是java.time可能未来增加内容的试验场。您可能会在这里找到一些有用的类,例如Interval
, YearWeek
, YearQuarter
,以及更多。