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)
答案 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)
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的当前默认时区。避免这门课。
而是使用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/Montreal
,Africa/Casablanca
或continent/region
。切勿使用诸如Pacific/Auckland
或EST
之类的3-4字母缩写,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。
IST
java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和& SimpleDateFormat
现在位于Joda-Time的maintenance 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的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
和more。