最佳实践
如果需要与遗留代码打交道,如何在新旧API之间互相转换呢?
如果要把旧式的或Calendar
转换为新API对象,可以通过toInstant()
方法转换为Instant
对象,再继续转换为ZonedDateTime
:
从上面的代码还可以看到,旧的TimeZone
提供了一个toZoneId()
,可以把自己变成新的ZoneId
。
如果要把新的ZonedDateTime
转换为旧的API对象,只能借助long
型时间戳做一个“中转”:
除了旧式的java.util.Date
,我们还可以找到另一个java.sql.Date
,它继承自java.util.Date
,但会自动忽略所有时间相关信息。这个奇葩的设计原因要追溯到数据库的日期与时间类型。
在数据库中,也存在几种日期和时间类型:
DATE
:仅表示日期;TIME
:仅表示时间;
在使用Java程序操作数据库时,我们需要把数据库类型与Java类型映射起来。下表是数据库类型与Java新旧API的映射关系:
实际上,在数据库中,我们需要存储的最常用的是时刻(Instant
),因为有了时刻信息,就可以根据用户自己选择的时区,显示出正确的本地时间。所以,最好的方法是直接用长整数long
表示,在数据库中存储为BIGINT
类型。
对上述方法进行调用,结果如下:
处理日期和时间时,尽量使用新的java.time
包;
在数据库中存储时间戳时,尽量使用long
型时间戳,它具有省空间,效率高,不依赖数据库的优点。