关于Date(长日期)

时间:2016-11-06 04:22:22

标签: java date

JDK1.8 API表示日期(长日期)的结果是基于1970年1月1日00:00:00 GMT的时间,但是当我通过设置date = 0测试它时,我发现结果不是周一01 01 08:00:00 CST 1970,不是00:00:00,而是08:00:00,为什么?the result about the Date(long date)

3 个答案:

答案 0 :(得分:1)

这是因为你的时区。 如果您将时区更改为GMT,则会显示00:00:00

Date date = new Date(0L);
TimeZone.setDefault(TimeZone.getTimeZone("GMT"));
System.out.println(date);

输出:Thu Jan 01 00:00:00 GMT 1970

答案 1 :(得分:0)

这是因为TimeZone设置,默认情况下由JVM设置&运行程序的位置,请查看Java doc中的以下语句。

  

通常,您使用getDefault获取TimeZone,这会创建一个   TimeZone基于程序运行的时区。对于   例如,对于在日本运行的程序,getDefault会创建一个TimeZone   基于日本标准时间的对象。

您可以查看here

答案 2 :(得分:0)

TL;博士

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类。

在其众多问题中,toString java.util.Date方法在生成字符串时隐式应用JVM的当前默认时区。避免这门课。

java.time

而是使用Instant。以UTC为单位表示时间轴上的时刻,分辨率为纳秒。

Instant.ofEpochSecond( 0 ).toString()
  

1970-01-01T00:00:00Z

或者使用该值的常量Instant.EPOCH

以UTC格式的当前时刻,请致电now

Instant.now()

要调整到特定时区,请搜索“{1}}和ZonedDateTime的堆叠溢出。

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

ZoneId的格式指定proper time zone name,例如America/MontrealAfrica/Casablancacontinent/region。切勿使用诸如Pacific/AucklandEST之类的3-4字母缩写,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。

IST

关于 java.time

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

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

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

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

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore