&引用;Java Date()返回UTC格式的日期";-这到底是什么意思?

&引用;Java Date()返回UTC格式的日期";-这到底是什么意思?,java,date,gmt,Java,Date,Gmt,我的问题可能很琐碎,但我只是想澄清一下。我在中的某个地方读到,Java的Date()实际上总是UTC时间,为什么当我创建一个Date()对象并使用toString()打印它时,它会显示本地时间。如果这不是正确的打印方式,那么应该是什么样的格式才能获得UTC时间?对于格式设置,您应该真正使用日期格式实现(例如SimpleDataFormat)。这将允许您指定时区(和输出格式)日期本身没有时区的概念-它表示时间上的一个瞬间,使用“从Unix纪元开始的毫秒”作为存储。toString()方法只是使用系

我的问题可能很琐碎,但我只是想澄清一下。我在中的某个地方读到,Java的Date()实际上总是UTC时间,为什么当我创建一个Date()对象并使用toString()打印它时,它会显示本地时间。如果这不是正确的打印方式,那么应该是什么样的格式才能获得UTC时间?

对于格式设置,您应该真正使用
日期格式
实现(例如
SimpleDataFormat
)。这将允许您指定时区(和输出格式)<代码>日期本身没有时区的概念-它表示时间上的一个瞬间,使用“从Unix纪元开始的毫秒”作为存储。
toString()
方法只是使用系统默认时区将表示的任何瞬间转换为本地时间

就我个人而言,我建议完全不要使用内置的日期/时间API,而是使用一个更合理的库

“Java Date()返回UTC格式的日期”-它实际上是什么意思

是我们调整全球时间的基准

因为穴居人的日子,中午,或12:00,是太阳正上方的时候。当然,这意味着在不同的地方有不同的时刻。日本的中午比欧洲早几个小时,而美洲的中午更晚

在现代,人类创造的正午将适用于广阔的土地,如此之宽,以至于太阳可能不会同时在其上方覆盖整个土地。所以太阳,或者说,不能再用来定义时间了。现代时区被定义为距离基线一定的时分秒数

什么基线?这条基线是历史命运任意选择的,是贯穿英国伦敦的纬度。东部的时区比UTC提前一定的时分秒数,西部的时区比UTC晚一定的时分秒数。例如,印度比UTC早五个半小时,加勒比海的马提尼克比UTC晚四个小时

如果偏移量为零小时分秒,则我们称为“在UTC”或“在UTC”

Java的Date()实际上始终是UTC时间

是的,
java.util.Date
类,尽管名称不太恰当,但它表示一个日期,其时间与UTC的偏移量为零

顺便说一下,
Date
类现在已经过时了。该类现在用作其替换,以表示UTC中的某个时刻<代码>即时的分辨率为,比日期的分辨率精细

当我创建一个Date()对象并使用toString()打印它时,它会显示本地时间

遗留日期时间类存在许多问题。如上所述,一个是命名不当。另一个是出于好意而做出的不幸的设计决策,即
Date::toString
应在生成文本时动态应用JVM的当前默认时区以从UTC进行调整。这个错误的决定给Java程序员带来了无尽的困惑和痛苦,因为它造成了
Java.util.Date
分配了时区的错觉

顺便说一句,更糟糕的是,
java.util.Date
确实有一个时区,但它深藏在源代码中,没有访问器getter/setter方法。但该区域确实会影响某些行为,例如确定此类对象之间的相等性。令人困惑对正如我所说,这些遗留日期时间类充斥着糟糕的设计决策

如果这不是正确的打印方式,那么应该是什么样的方式才能获得UTC时间

正确的方法是完全避免使用
Date
类。而只使用java.time类

➥ 要获取UTC的当前时刻,请使用

提示:如果您想为了人工测试的目的而改变时间,请将替代时间传递给

要生成一个标准格式的
字符串
,其中文本表示该
即时
的值,只需调用
toString
。幸运的是,这个类不像
Date
那样注入时区。该方法讲述了简单的事实,即UTC中的时刻文本

String output = instant.toString() ;
2019-12-03T10:15:30.032163Z

请明确,日期时间对象(如
Instant
)没有“格式”。只有表示这些对象的值的文本才具有格式。文本和日期时间对象是不同的,彼此独立。日期时间对象可以生成这样的文本,并可以解析这样的文本,但实际上不是文本

如果您需要灵活地以其他格式生成文本,请应用
ZoneOffset
以获取
OffsetDateTime
对象,或应用
ZoneId
以获取
zoneDateTime
对象。应用
DateTimeFormatter
对象生成文本


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

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

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

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

从哪里获得java.time类

  • 、和更高版本-标准Java API的一部分,带有捆绑实现。
    • Java9添加了一些次要功能和修复
    • 大多数java.time功能都在中向后移植到Java6和Java7
    • 更高版本的Android捆绑包实现了java.time类

    • 对于早期的Android(是的,实际上是从你的帖子中我提出了这个问题。对于打印,是的,我确实使用了DateFormat。但是“UTC”与Date()有什么关系呢
      String output = instant.toString() ;