Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 调用'new Date(long)`会导致“Jan 01:00:00 CET 1970”?_Java_Date_Datetime_Timezone_Utc - Fatal编程技术网

Java 调用'new Date(long)`会导致“Jan 01:00:00 CET 1970”?

Java 调用'new Date(long)`会导致“Jan 01:00:00 CET 1970”?,java,date,datetime,timezone,utc,Java,Date,Datetime,Timezone,Utc,Java文档描述了构造函数Datelong date从1970年1月1日00:00:00 GMT开始使用给定的毫秒时间值构造日期对象 当我开始新的约会0时,日期是1970年1月1日01:00:00 CET 我不知道为什么它以01小时开始,因为你比格林尼治标准时间早了一个小时。日期实例只是从1970年格林尼治标准时间的00:00:00开始的毫秒数的计数器。自从你比1970年格林尼治标准时间早了一个小时,当大纪元发生时,实际上是凌晨1点 Date实例只是将其toString方法格式化为使用系统的时区

Java文档描述了构造函数Datelong date从1970年1月1日00:00:00 GMT开始使用给定的毫秒时间值构造日期对象

当我开始新的约会0时,日期是1970年1月1日01:00:00 CET


我不知道为什么它以01小时开始,因为你比格林尼治标准时间早了一个小时。日期实例只是从1970年格林尼治标准时间的00:00:00开始的毫秒数的计数器。自从你比1970年格林尼治标准时间早了一个小时,当大纪元发生时,实际上是凌晨1点


Date实例只是将其toString方法格式化为使用系统的时区。如果要使用不同的区域打印日期,请使用实例。

这是因为您在欧洲时区CET中显示日期,而在unix时间中显示日期对象的毫秒数使用GMT。

tl;博士 细节 尼科尔斯的答案是正确的,但已经过时了

您所在的时区在该日期比UTC提前一小时,因此UTC的午夜是您所在时区的凌晨1点。 现在,您应该使用java.time类,例如Instant,而不是Date。 避免遗留类 避免现在被java.time类取代的麻烦的旧日期时间类

遗留类的许多问题中有一个糟糕的设计选择,即让toString方法在生成表示对象值的字符串时动态应用JVM的当前默认时区。日期实际上代表UTC中的一个时刻。完全避免尴尬的课堂。如果需要,可以通过添加到旧类中的新方法在旧类和现代类之间进行转换

UTC即时 该类表示时间线上的某个时刻,分辨率高达9位小数

Instant instant = Instant.now() ;  // Current moment in UTC.
instant.toString:2018-02-11T21:07:02.315283Z

如果您想要java.time类使用的历元参考时刻,即UTC中1970年的第一个时刻,请使用预定义的常量:Instant.epoch

Instant.EPOCH.toString:1970-01-01T00:00:00Z

抵销日期时间 如果需要更大的灵活性,例如以其他格式生成字符串,请使用常量ZoneOffset.UTC将即时对象转换为OffsetDateTime

ISO 8601 将日期时间值交换为文本时,请使用标准格式。它们被设计成便于机器解析,同时也便于不同文化背景下的人类阅读

在生成/解析字符串时,java.time类默认使用标准ISO 8601格式。因此,无需指定格式化模式

时区 如果要通过另一地区的人使用的挂钟时间的镜头看到相同的同时时刻,请应用时区ZoneId以获取ZonedDateTime对象

以大陆/地区的格式指定,例如,或太平洋/奥克兰。千万不要使用3-4个字母的缩写,如EST、IST或CET,因为它们不是真正的时区,不是标准化的,甚至不是唯一的

ZoneId z = ZoneId.of( "Europe/Paris" ) ;
ZonedDateTime zdt = instant.atZone( z ) ;
zdt.toString:2018-02-11T22:07:02.315283+01:00[欧洲/巴黎]

让我们看看java.time epoch在同一时区中的参考时刻

ZonedDateTime zdtEpochParis = Instant.EPOCH.atZone( z ) ;
ZonedDateTime zdtEpochMontreal = Instant.EPOCH.atZone( ZoneId.of( "America/Montreal" ) ) ;
zdtEpochParis.toString:1970-01-01T01:00+01:00[欧洲/巴黎]

再一次,换一个时区

ZonedDateTime zdtEpochParis = Instant.EPOCH.atZone( z ) ;
ZonedDateTime zdtEpochMontreal = Instant.EPOCH.atZone( ZoneId.of( "America/Montreal" ) ) ;
蒙特利尔:1969-12-31T19:00-05:00[美国/蒙特利尔]

关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&

该项目现已启动,建议迁移到类

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是

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

从哪里获得java.time类

,及以后 内置的。 标准JavaAPI的一部分,带有捆绑实现。 Java9添加了一些次要功能和修复。 和 大部分java.time功能都在中向后移植到Java6和Java7。 更高版本的Android捆绑包实现了java.time类。 对于早期的Android,该项目采用了上面提到的Three-Ten Backport。看见
该项目使用其他类扩展了java.time。这个项目是java.time将来可能添加的一个试验场。您可能会在这里找到一些有用的类,例如、、和。

嗨,nichols如果我想使用stardart时区GMT而不是CET,那么HH:mm:ss的模式是什么?我尝试过HH:mm:ss GMT,它不起作用