调用“new Date(long)”会导致“Jan 01 01:00:00 CET 1970”?
Java 文档描述了构造函数 Date(long date)
使用自 1970 年 1 月 1 日 00:00:00 GMT
当我执行 new Date( 0)
,日期是 1970 年 CET 1 月 1 日 01:00:00
我不知道为什么它以 01h 开头
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
节目时间为凌晨 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.
这是因为您显示的是欧洲时区 (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.tl;dr
详细信息
尼科尔斯的答案是正确的,但已经过时了。
Instant
而不是Date
。避免遗留类
避免现在被 java.time 类取代的麻烦的旧日期时间类。
遗留类存在许多问题,其中之一就是糟糕的设计选择,即让 toString 方法在生成表示对象值的字符串时动态应用 JVM 当前的默认时区。
Date
实际上代表 UTC 中的一个时刻。完全避免尴尬的课堂。如有必要,可以通过添加到旧类中的新方法在旧类和现代类之间进行转换。UTC 的
Instant
< code>Instant 类表示 UTC 时间轴上的时刻分辨率为纳秒(最多九 (9) 位小数)。
如果您想要 java.time 类使用的纪元参考时刻(UTC 1970 年的第一个时刻),请使用预定义常量:
Instant.EPOCH
。OffsetDateTime
如果您需要更大的灵活性,例如以其他格式生成字符串,请转换
Instant
对象使用常量ZoneOffset.UTC
转换为OffsetDateTime
。ISO 8601
将日期时间值交换为文本时,请使用标准 ISO 8601 格式。它们被设计为易于机器解析,同时也易于跨文化的人类阅读。
java.time 类在生成/解析字符串时默认使用标准 ISO 8601 格式。因此无需指定格式模式。
时区,
ZonedDateTime
如果您想通过其他地区的人们使用的挂钟时间的镜头看到同一时刻,请应用时区 (
ZoneId
) 获取ZonedDateTime
对象。以
大陆/地区
格式指定正确的时区名称 ,例如America/Montreal
、非洲/卡萨布兰卡
,或太平洋/奥克兰
。切勿使用 3-4 个字母的缩写,例如EST
或IST
或CET
,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。让我们看看同一时区的 java.time 纪元参考时刻。
再次,针对另一个时区。
关于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
Details
The Answer by Nichols is correct but outdated.
Instant
instead ofDate
.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. ADate
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 UTCThe
Instant
class represents a moment on the timeline in UTC with a resolution of nanoseconds (up to nine (9) digits of a decimal fraction).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
.OffsetDateTime
If you need more flexibility, such as generating strings in other formatting, convert the
Instant
object to aOffsetDateTime
using the constantZoneOffset.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 aZonedDateTime
object.Specify a proper time zone name in the format of
continent/region
, such asAmerica/Montreal
,Africa/Casablanca
, orPacific/Auckland
. Never use the 3-4 letter abbreviation such asEST
orIST
orCET
as they are not true time zones, not standardized, and not even unique(!).Let's look at the java.time epoch reference moment through the same time zone.
Again, for another time zone.
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.