JDK1.8 API说Date(long date)的结果基于格林尼治标准时间1970年1月1日00:00:00,但是当我通过设置date = 0进行测试时,我发现结果不是1970年CST 1月1日08:00:00,不是00:00:00,而是08:00:00,为什么?the result about the Date(long date)

最佳答案

tl; dr

Instant.EPOCH.toString()



  1970-01-01T00:00:00Z


Instant.EPOCH.atZone( ZoneId.of( "America/Chicago" ) ).toString()  // Use proper time zone names (continent/region). Avoid pseudo-zones such as `CST`, which could be Central Standard Time in US or China Standard Time.



  1969-12-31T18:00-06:00 [美国/芝加哥]


Instant.EPOCH.atZone( ZoneId.of( "Asia/Hong_Kong" ) ).toString()



  1970-01-01T08:00 + 08:00 [亚洲/香港]


避免使用旧的日期时间类

您正在使用旧的日期时间类(现在已被遗留)取代了java.time类。

在其众多问题中,toStringjava.util.Date方法在生成字符串时隐式应用了JVM当前的默认时区。避免此类。

java.time

而是使用Instant。代表UTC时间线上的时刻,分辨率为纳秒。

Instant.ofEpochSecond( 0 ).toString()



  1970-01-01T00:00:00Z


或对该值使用常量Instant.EPOCH

对于UTC中的当前时刻,请调用now

Instant.now()


要适应特定时区,请在堆栈溢出中搜索ZonedDateTimeZoneId

调整到另一个时区。时间线上的相同时刻,相同同时点,但挂钟时间不同。

continent/region的格式指定proper time zone name,例如America/MontrealAfrica/CasablancaPacific/Auckland。切勿使用3-4个字母的缩写,例如ESTIST,因为它们不是真实的时区,不是标准化的,甚至不是唯一的(!)。

ZoneId z = ZoneId.of( "Asia/Hong_Kong" ) ;
ZonedDateTime zdt = instant.atZone( z ) ;




关于java.time

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

现在位于Joda-Time中的maintenance mode项目建议迁移到java.time类。

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

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

在哪里获取java.time类?


Java SE 8Java SE 9和更高版本


内置的
标准Java API的一部分,具有捆绑的实现。
Java 9添加了一些次要功能和修复。

Java SE 6Java SE 7


ThreeTen-Backport中的许多java.time功能都已反向移植到Java 6和7。

Android


更高版本的Android捆绑了java.time类的实现。
对于早期的Android,ThreeTenABP项目改编了ThreeTen-Backport(如上所述)。请参见How to use ThreeTenABP…



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

07-24 18:40
查看更多