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

发布于 2024-08-27 18:49:33 字数 195 浏览 14 评论 0 原文

Java 文档描述了构造函数 Date(long date) 使用自 1970 年 1 月 1 日 00:00:00 GMT

当我执行 new Date( 0),日期是 1970 年 CET 1 月 1 日 01:00:00

我不知道为什么它以 01h 开头

The Java doc describe that the constructor Date(long date) constructs a Date object using the given milliseconds time value since January 1, 1970, 00:00:00 GMT

When I did new Date(0), the date is Jan 01 01:00:00 CET 1970

I don't know why it begin with 01h

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

我的黑色迷你裙 2024-09-03 18:49:33

节目时间为凌晨 1 点,因为比 GMT 早一个小时。日期实例只是自 1970 年 00:00:00 GMT 以来的毫秒数计数器。由于您提前了一个小时,因此纪元发生时实际上是您的时间凌晨 1 点。

Date 实例只需格式化其 toString() 方法即可使用系统的时区。如果要使用不同区域打印日期,请使用 DateFormat 实例。

It's show 1AM because you're an hour ahead of GMT. A date instance is simply a counter of the number of milliseconds since 00:00:00 1970 GMT. Since your an hour ahead, when the epoch occurred it was actually 1AM your time.

The Date instance simply formats its toString() method to use your system's timezone. If you want to print out a date using a different zone, use a DateFormat instance.

一花一树开 2024-09-03 18:49:33

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

This is because you are showing the date in the European timezone (CET) the unix time (the milliseconds you are giving the Date object) use GMT.

陈甜 2024-09-03 18:49:33

tl;dr

Instant.now()  // Current moment in UTC.

详细信息

尼科尔斯的答案是正确的,但已经过时了。

  • 您所在的时区在该日期比 UTC 早一小时,因此 UTC 午夜是您所在区域的凌晨 1 点。
  • 现在您应该使用java.time类,例如Instant而不是Date

避免遗留类

避免现在被 java.time 类取代的麻烦的旧日期时间类。

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

UTC 的 Instant

< code>Instant 类表示 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

OffsetDateTime

如果您需要更大的灵活性,例如以其他格式生成字符串,请转换 Instant 对象使用常量 ZoneOffset.UTC 转换为 OffsetDateTime

OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC ) ;

ISO 8601

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

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

时区,ZonedDateTime

如果您想通过其他地区的人们使用的挂钟时间的镜头看到同一时刻,请应用时区 (ZoneId ) 获取 ZonedDateTime 对象。

大陆/地区格式指定正确的时区名称 ,例如 America/Montreal非洲/卡萨布兰卡,或太平洋/奥克兰 。切勿使用 3-4 个字母的缩写,例如 ESTISTCET,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。

ZoneId z = ZoneId.of( "Europe/Paris" ) ;
ZonedDateTime zdt = instant.atZone( z ) ;

zdt.toString(): 2018-02-11T22:07:02.315283+01:00[欧洲/巴黎]

让我们看看同一时区的 java.time 纪元参考时刻。

ZonedDateTime zdtEpochParis = Instant.EPOCH.atZone( z ) ;

zdtEpochParis.toString(): 1970-01-01T01:00+01:00[欧洲/巴黎]

再次,针对另一个时区。

ZonedDateTime zdtEpochMontreal = Instant.EPOCH.atZone( ZoneId.of( "America/Montreal" ) ) ;

zdtEpochMontreal.toString(): 1969-12-31T19:00-05:00[美国/蒙特利尔]


关于java.time

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

Joda-Time 项目,现已在 维护模式,建议迁移到 java.time 类。

要了解更多信息,请参阅 Oracle 教程。并在 Stack Overflow 上搜索许多示例和解释。规范为 JSR 310

使用符合 JDBC 驱动程序 /jeps/170" rel="nofollow noreferrer">JDBC 4.2 或更高版本,您可以直接与数据库交换 java.time 对象。不需要字符串或 java.sql.* 类。

从哪里获取 java.time 类?

ThreeTen-Extra 项目通过附加类扩展了 java.time 。该项目是 java.time 未来可能添加的内容的试验场。您可能会在这里找到一些有用的类,例如 间隔YearWeek<代码>YearQuarter,以及更多

tl;dr

Instant.now()  // Current moment in UTC.

Details

The Answer by Nichols is correct but outdated.

  • Your own time zone was an hour ahead of UTC on that date, so midnight in UTC is 1 AM in your zone.
  • Nowadays you should be using java.time classes such as Instant instead of Date.

Avoid legacy classes

Avoid the troublesome old date-time classes now supplanted by the java.time classes.

Among the many problems of the legacy classes was the poor design choice to have the toString method dynamically apply the JVM’s current default time zone while generating the string representing the object’s value. A Date actually represents a moment in UTC. Avoid awkward class entirely. If necessary, convert between the legacy and modern classes via new methods added to the old classes.

Instant for UTC

The Instant class represents a moment on the timeline in UTC with a resolution of nanoseconds (up to nine (9) digits of a decimal fraction).

Instant instant = Instant.now() ;  // Current moment in UTC.

instant.toString(): 2018-02-11T21:07:02.315283Z

If you want the epoch reference moment used by the java.time classes, the first moment of 1970 in UTC, use the predefined constant: Instant.EPOCH.

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

OffsetDateTime

If you need more flexibility, such as generating strings in other formatting, convert the Instant object to a OffsetDateTime using the constant ZoneOffset.UTC.

OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC ) ;

ISO 8601

When exchanging date-time values as text, use the standard ISO 8601 formats. They were designed to be easy to parse by machine while also being easy to read by humans across various cultures.

The java.time classes use the standard ISO 8601 formats by default when generating/parsing strings. So no need to specify a formatting pattern.

Time zone, ZonedDateTime

If you want to see the same simultaneous moment through the lens of the wall-clock time used by the people of another region, apply a time zone (ZoneId) to get a ZonedDateTime object.

Specify a proper time zone name in the format of continent/region, such as America/Montreal, Africa/Casablanca, or Pacific/Auckland. Never use the 3-4 letter abbreviation such as EST or IST or CET as they are not true time zones, not standardized, and not even unique(!).

ZoneId z = ZoneId.of( "Europe/Paris" ) ;
ZonedDateTime zdt = instant.atZone( z ) ;

zdt.toString(): 2018-02-11T22:07:02.315283+01:00[Europe/Paris]

Let's look at the java.time epoch reference moment through the same time zone.

ZonedDateTime zdtEpochParis = Instant.EPOCH.atZone( z ) ;

zdtEpochParis.toString(): 1970-01-01T01:00+01:00[Europe/Paris]

Again, for another time zone.

ZonedDateTime zdtEpochMontreal = Instant.EPOCH.atZone( ZoneId.of( "America/Montreal" ) ) ;

zdtEpochMontreal.toString(): 1969-12-31T19:00-05:00[America/Montreal]


About java.time

The java.time framework is built into Java 8 and later. These classes supplant the troublesome old legacy date-time classes such as java.util.Date, Calendar, & SimpleDateFormat.

The Joda-Time project, now in maintenance mode, advises migration to the java.time classes.

To learn more, see the Oracle Tutorial. And search Stack Overflow for many examples and explanations. Specification is JSR 310.

With a JDBC driver complying with JDBC 4.2 or later, you may exchange java.time objects directly with your database. No need for strings or java.sql.* classes.

Where to obtain the java.time classes?

The ThreeTen-Extra project extends java.time with additional classes. This project is a proving ground for possible future additions to java.time. You may find some useful classes here such as Interval, YearWeek, YearQuarter, and more.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文