Date.from(从ZonedDateTime到Instant)返回前一天

时间:2019-04-25 18:12:37

标签: java datetime java.time

我在Java中ZonedDateTime类型的变量是time="2017-01-03T00:00Z[UTZ]"。当我尝试从这样的日期-Date.from(time.toInstance())获取日期时,它返回前一天,即Mon Jan 02 19:00:00 EST 2017,我不知道为什么?有人可以告诉我前一天返回的商品吗?

2 个答案:

答案 0 :(得分:0)

避免使用旧的日期时间类

从不使用java.util.Date类。那个可怕的类以及CalendarSimpleDateFormat以及其他类似的东西现在已成为历史。添加到旧类中的新to / from转换方法仅适用于与尚未更新为 java.time 的旧代码进行互操作时使用。尽可能避免使用Date

Date中的许多缺陷中的一个不幸之处是,它在通过toString方法生成文本时动态应用JVM当前的默认时区。因此,看来Date具有时区,而实际上Date代表UTC的时刻。 换句话说,Date::toString说谎。避免上此类课的众多原因之一。

➥在2017年冬季,北美东海岸的许多时区都比UTC落后五个小时。因此,在纽约,蒙特利尔等地,UTC的午夜时间同时是下午7点(19:00)。同一时刻,不同的挂钟时间。

java.time

Date类在Instant年前被取代。

  

ZonedDateTime是说时间=“ 2017-01-03T00:00Z [UTZ]”

如果您要跟踪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() ;

Table of date-time types in Java, both modern and legacy


关于 java.time

java.time框架已内置在Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendarSimpleDateFormat

要了解更多信息,请参见Oracle Tutorial。并在Stack Overflow中搜索许多示例和说明。规格为JSR 310

目前位于Joda-Timemaintenance mode项目建议迁移到java.time类。

您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*类。

在哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展了java.time。该项目为将来可能在java.time中添加内容提供了一个试验场。您可能会在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore

答案 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