我在Java中ZonedDateTime
类型的变量是time="2017-01-03T00:00Z[UTZ]"
。当我尝试从这样的日期-Date.from(time.toInstance())
获取日期时,它返回前一天,即Mon Jan 02 19:00:00 EST 2017
,我不知道为什么?有人可以告诉我前一天返回的商品吗?
答案 0 :(得分:0)
从不使用java.util.Date
类。那个可怕的类以及Calendar
和SimpleDateFormat
以及其他类似的东西现在已成为历史。添加到旧类中的新to
/ from
转换方法仅适用于与尚未更新为 java.time 的旧代码进行互操作时使用。尽可能避免使用Date
。
Date
中的许多缺陷中的一个不幸之处是,它在通过toString
方法生成文本时动态应用JVM当前的默认时区。因此,看来Date
具有时区,而实际上Date
代表UTC的时刻。 换句话说,Date::toString
说谎。避免上此类课的众多原因之一。
➥在2017年冬季,北美东海岸的许多时区都比UTC落后五个小时。因此,在纽约,蒙特利尔等地,UTC的午夜时间同时是下午7点(19:00)。同一时刻,不同的挂钟时间。
Date
类在Instant
年前被取代。
ZonedDateTime是说时间=“ 2017-01-03T00:00Z [UTZ]”
如果您要跟踪UTC中的时刻,请使用以下任一方法:
Instant
Instant.now()
OffsetDateTime
对象设置为UTC。OffsetDateTime.now( ZoneOffset.UTC )
在时区上下文中有片刻时,请使用ZonedDateTime
类。 time zone是特定区域的人们对offset-from-UTC的过去,现在和将来的更改的历史。
ZonedDateTime.now(
ZoneId.of( "Africa/Tunis" )
)
您可以在UTC和区域之间进行调整。同一时刻,查看方式不同,挂钟时间不同。
ZonedDateTime zdt = instant.atZone( ZoneId.of( "Pacific/Auckland" ) ) ;
…和…
Instant instant = zdt.toInstant() ;
java.time框架已内置在Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和SimpleDateFormat
。
要了解更多信息,请参见Oracle Tutorial。并在Stack Overflow中搜索许多示例和说明。规格为JSR 310。
目前位于Joda-Time的maintenance mode项目建议迁移到java.time类。
您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*
类。
在哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展了java.time。该项目为将来可能在java.time中添加内容提供了一个试验场。您可能会在这里找到一些有用的类,例如Interval
,YearWeek
,YearQuarter
和more。
答案 1 :(得分:0)
ZonedDateTime.toInstant()调整从时区到UTC的时间。您最终会获得相同的时刻,不同的时钟时间,以及时间轴上同一同时点的不同日期。您所看到的不是问题,不是差异。
诸如LocalDate和ZonedDateTime之类的类提供了人类时间观。 但是,通常我们需要从机器角度来看待时间。 为此,我们可以使用表示时间戳的Instant类。
Instant计算从1970年1月1日(1970-01-01 00:00:00)的第一秒开始的时间,也称为EPOCH。
如果瞬时值出现在纪元之前,则它们可以为负。它们遵循ISO 8601表示日期和时间的标准。
还请使用Java 8中引入的Java Time API库,因为现有的Date和Calendar API中存在许多问题,请 参考:https://www.baeldung.com/java-8-date-time-intro