java.util.Date::toString
应用区
您可能会被
Java.UTI.DAT::ToSoin
方法动态应用JVM的当前默认时区,同时生成一个字符串来表示
Date
根据定义,它实际上总是在UTC中。什么之中的一个
许多的
避免这个麻烦的老阶级的理由。
数据库中的数据类型错误
我在postgres中有一个字段的类型是“timestamp without timezone”。这是数据库中的UTC时间,我想在API响应中显示。
这在术语上是矛盾的。sql标准
TIMESTAMP WITHOUT TIME ZONE
列不包含UTC值。该数据类型缺少时区或与UTC的偏移量的概念。(这样的UTC值应该存储在类型为
TIMESTAMP WITH TIME ZONE
)
您插入的值可能是
打算
对于UTC,但一旦存储到数据库中,就失去了这个事实。
Java.时间
避免
java.sql.Timestamp
有
不
需要使用
java.sql.timestamp时间戳
. 应该避免使用那个遗留类。从jdbc 4.2及更高版本开始,我们可以直接交换
Java.时间
使用数据库键入。
Hibernate supports
java.time
.
LocalDateTime
如果缺少任何区域/偏移,则应使用
LocalDateTime
班级。该类还缺少时区或与UTC的偏移量的任何概念。
LocalDateTime ldt = myResultSet.getObject( ⦠, LocalDateTime.class ) ;
OffsetDateTime
如果你想的话
假定
检索到的值表示UTC中的某个时刻,应用
ZoneOffset
得到
OffsetDateTime
对象。具体来说,对于UTC,我们可以使用预定义的常量
ZoneOffset.UTC
.
OffsetDateTime odt = ldt.atOffset( ZoneOffset.UTC ) ;
不是
ZonedDateTime
而
分区日期
从技术上讲,类将在这里代替
偏移日期时间
类,它的使用是不适当的。
时区不仅仅是偏移量。区域是过去、现在和将来对特定区域的人使用的偏移量的变化的历史。相比之下,与UTC的偏移量仅为几个小时和分钟,不多也不少。
所以使用一个
分区日期
在联合技术公司的这一背景下是误导性的,而且可能令人困惑。
Instant
现在,在你
偏移日期时间
对象,您有时间使用UTC。
如果你知道你只想在UTC工作,从那里提取
瞬间
. 安
瞬间
根据定义总是在UTC中。当用UTC表示时刻时,通常使用
瞬间
. 如果需要更大的灵活性,例如生成各种格式的字符串,请切换到使用
偏移日期时间
.
Instant instant = odt.toInstant() ;
关于
Java.时间
这个
java.time
框架是在Java 8和之后构建的。这些类取代了麻烦的旧类
legacy
日期时间类,如
java.util.Date
,
Calendar
和;
SimpleDateFormat
.
这个
Joda-Time
项目,现在在
maintenance mode
,建议迁移到
java.time
类。
要了解更多信息,请参阅
Oracle Tutorial
. 和搜索堆栈溢出的许多例子和解释。规格是
JSR 310
.
你可以交换
Java.时间
直接使用数据库的对象。使用
JDBC driver
符合
JDBC 4.2
或稍后。不需要弦,不需要
java.sql.*
类。
在哪里获得java.time类?
这个
ThreeTen-Extra
project使用其他类扩展java.time。这个项目是将来可能添加java.time的一个试验场。你可以在这里找到一些有用的类,比如
Interval
,
YearWeek
,
YearQuarter
和
more
.