UTC和GMT之间的差异

Ana*_*gha 16 timezone datetime utc gmt

嗨我对时区的疑问很少:

  1. 可以仅用UTC捕获时间吗?
  2. UTC -6和GMT -6是否相同,这是否意味着它是美国当地时间?
  3. 比如,我的UTC时间为"02-01-2018 00:03"这是否意味着我的美国当地时间是"01-01-2018 18:00"?

我搜索了维基百科和许多相关网站,但没有找到相关的解释

Ole*_*.V. 19

天文学与原子钟

不同之处在于GMT(也称为通用时间(UT),可能令人困惑)基于天文观测,而UTC则基于原子钟.

GMT代表格林威治标准时间,即英国东伦敦南岸格林威治皇家天文台的平均太阳时.当太阳位于格林威治正上方的最高点时,格林威治标准时间中午12点.除了:地球略微不均匀地旋转,因此中午12被定义为年平均值,即太阳最高时的平均值,它的高潮.在GMT中,永远不会有任何闰秒,因为地球的旋转不会跳跃.

UTC代表英语协调世界时,由原子钟定义,但在其他方面相同.在UTC中,第二个总是具有相同的长度.以UTC 格式插入闰秒,以防止UTC和GMT分开.相比之下,在GMT中,根据需要延长秒数,因此原则上它们并不总是具有相同的长度.

在100年的时间里,GMT被用作定义世界时间的基础.由于现在世界主要基于原子钟上时间的精确定义,因此习惯上将时间定义基于UTC.

对于你的问题:

  1. 是的,时间可以仅用UTC捕获.以UTC格式存储时间并使用UTC传输日期时间信息通常被认为是一种良好做法.
  2. 我想由美国每个州来定义它的时间.我不知道,但我想今天他们(正式或实际)将时间定义为与UTC而不是GMT的偏移.两者之间的差异总是小于一秒,所以出于许多目的,你不需要关心.中央标准时间(例如美国/芝加哥)偏移-6,山日光时间(例如美国/丹佛)也是如此.另一方面,抵消-6并不一定意味着在美国的时间.当然,加拿大和墨西哥的部分地区也使用它,加拉帕戈斯群岛和复活节岛也使用它.
  3. 我不认为你的例子时间完全正确,但是,2018年1月2日00:00 UTC与2018年1月1日18:00在芝加哥和其他地方的UTC-6相同的时间点相同冬天(北半球的冬天,即).

进一步阅读:时间系统.

  • 感谢@JohnChris,您试图解释否决票。形成您的链接:“与基于太阳时的 GMT 不同,UTC 计算秒为“9192631770 个周期的持续时间”。与铯 133 原子基态的两个超精细能级之间的跃迁相对应的辐射”。这不正是我所说的,只是用词不同吗?我会删除失效的链接,谢谢。 (7认同)
  • 这就是我投反对票的原因:这个答案是错误的,请阅读此处:[currentmillis](https://currentmillis.com/)。UTC 和 GMT 是以相同方式导出的当前时间。从历史上看你是正确的,但现在情况不再如此 (2认同)

Bas*_*que 16

?该接受的答案既不是正确的也没有什么用处。

?相反,Ole VV的Answer正确地总结了技术差异-有关详细信息,请访问Wikipedia中详细页面的链接。

对于开发面向业务的应用程序的程序员而言,结果是UTC是新的GMT。您可以互换使用这些术语,而差异实际上不到一秒钟。因此,对于大多数应用程序而言,出于所有实际目的,完全没有区别。

这是一些更实用的建议,以及代码示例。

弦乐

假设我的UTC时间为“ 02-01-2018 00:03”,这表示我的美国当地时间为“ 01-01-2018 18:00”吗?

第一部分是一个不好的例子,日期时间字符串缺少其偏移量或区域的指示符。

如果字符串指示特定时刻,则必须指示时区Continent/Region秒数的形式格式名称)和/或距UTC的偏移量。如果该字符串用于表示UTC本身的时刻,则表示相对于UTC的偏移为零。

为了以偏移量写入该字符串,可以应用各种约定。在实践中最好是与两个小时和分钟以冒号沿,如+00:00+05:30,或-08:00。前导零和冒号都是可选的,但是我已经看到库在遇到诸如-0800或的值时会中断-8

祖鲁族

作为零偏移量的快捷方式,该字母Z通常用于表示UTC本身。发音Zulu

ISO 8601

此外,对我们来说,以文本格式格式化日期时间以进行计算的最佳实践是ISO 8601标准格式。对于日期时间,使用格式YYYY-MM-DDTHH:MM:SS±HH:MM:SS。将T日期部分与时间部分分开。这种格式具有以下优点:在很大程度上是明确的,易于通过机器解析,易于跨文化的人阅读。另一个优点是按字母顺序排序也是按时间顺序排序的。该标准也接受Z缩写。

因此,您的示例UTC time as "02-01-2018 00:03"最好用表示2018-01-02T00:03Z

java.time

请注意,大多数编程语言,库和数据库对日期时间处理的支持都很差,通常是基于对日期时间问题的了解不足。处理日期时间令人惊讶地复杂且难以掌握。

我遇到的唯一一个不错的库是与Java 8和更高版本捆绑在一起的java.time类(请参阅教程),以及它的前身Joda-Time项目(在Noda Time项目中也从Java松散地移植到.Net )。

java.time中,时刻以三种方式表示。所有这些都具有纳秒级的分辨率。

  • Instant
    始终使用UTC。从技术上讲,是自1970年第一时刻的纪元参考(1970-01-01T00:00:00Z)以来的纳秒计数。
  • OffsetDateTime
    在UTC之前或之后,以小时为单位的分钟数秒内的日期。
  • ZonedDateTime
    具有特定时区上下文中的日期的日期。

那么,时区UTC偏移量有什么区别?为什么我们需要单独的课程?与UTC的偏移量只是小时-分钟-秒的数目,三个数字,不多也不少。在一个时区更多。时区是特定区域的人们过去,现在和将来对偏移量的更改的历史记录。

有什么变化?由政客的异想天开或智慧决定的变化。世界各地的政客都表现出偏爱更改其辖区时区使用的偏移量。夏令时(DST)是一种常见的更改模式,其日程安排经常更改,并且制定或撤消DST的决定有时也会更改。其他变化也发生了,例如在最近几年中,朝鲜将钟表每半小时更改为与韩国同步,委内瑞拉将钟表半小时后退,直到不到十年后才跳回,土耳其今年取消了从夏令时到标准时间的预定更改,几乎没有预警,俄罗斯 近年来进行了多次此类更改。

回到第3点的示例,让我们看一些代码。

假设我的UTC时间为“ 02-01-2018 00:03”,这表示我的美国当地时间为“ 01-01-2018 18:00”吗?

您的示例字符串还有另一个问题。03第一部分的这一分钟被忽略,而第二部分则是明显的错别字。我知道,因为在该日期,美洲没有生效的时区调整,涉及小数小时为57分钟。

一会儿

首先,我们解析您的输入字符串。缺少区域或偏移量的任何指标,我们必须使用进行解析LocalDateTime。该名称LocalDateTime可能会引起误解,因为它确实表示特定的位置。它表示任何或所有地区。有关更多说明,请参见Instant和LocalDateTime有什么区别?

String input = "2018-01-02T00:03" ;                  // Text of a date with time-of-day but without any context of time zore or offset-from-UTC. *Not* a moment, *not* a point on the timeline.
LocalDateTime ldt = LocalDateTime.parse( input ) ;   // Parsing the input as a `LocalDateTime`, a class representing a date with time but no zone/offset. Again, this does *not* represent a moment, is *not* a point on the timeline. 
Run Code Online (Sandbox Code Playgroud)

世界标准时间

根据问题中给出的事实,我们知道此日期和时间旨在代表UTC的时刻。因此,我们可以为UTC本身分配一个从UTC偏移0小时-分钟-秒的上下文。我们应用ZoneOffset常数UTC来获取OffsetDateTime对象。

OffsetDateTime odt = ldt.atOffset( ZoneOffset.UTC );    // We are certain this text was intended to represent a moment in UTC. So correct the faulty text input by assigning the context of an offset of zero, for UTC itself.
Run Code Online (Sandbox Code Playgroud)

时区

该课题要求通过比美国使用的UTC时间晚六小时的挂钟时间来了解这一刻。具有此类偏移的一个时区为America/Chicago

指定适当的时区名称,格式continent/region,如America/MontrealAfrica/CasablancaPacific/Auckland。切勿使用2-4个字母的缩写,例如CSTEST或者IST因为它们不是真正的时区,不规范,甚至不是唯一的(!)。

ZoneId z = ZoneId.of( "America/Chicago" ) ; // Adjust from UTC to a time zone where the wall-clock time is six hours behind UTC.
ZonedDateTime zdt = odt.atZoneSameInstant( z ) ;
Run Code Online (Sandbox Code Playgroud)

参见IdeOne.com实时运行代码

odt.toString():2018-01-02T00:03Z

zdt.toString():2018-01-01T18:03-06:00 [美国/芝加哥]

相同的时刻,不同的时钟时间

odtzdt双方代表相同的同时时刻,在时间轴上的相同点。唯一的区别是挂钟时间。

让我们工作一个例子,使用冰岛,其时区使用零时分分钟秒的UTC偏移量。因此,该区域Atlantic/Reykjavik的挂钟时间与UTC相同。至少目前,他们的挂钟时间与UTC匹配;在过去或将来可能会有所不同,这就是为什么说“ UTC 冰岛的时区”是不正确的。无论如何,以我们的例子为例……说一个在冰岛雷克雅未克的人在午夜3点钟挂在他们墙上的时钟上打了个电话给美国某人。该美国人居住在使用芝加哥地区时区的地方。当被叫人拿起电话时,他们抬头看挂在墙上的时钟,发现时间刚好是下午6点(18:03)。相同的时刻,不同的时钟时间。

另外,挂在墙上的日历也不同,因为在冰岛是“明天”,而在美国大陆是“昨天”。同一时刻,不同的日期!


Java中的日期时间类型表,包括现代的和传统的。


关于java.time

java.time框架是建立在Java 8和更高版本。这些类取代麻烦的老传统日期时间类,如java.util.DateCalendar,和SimpleDateFormat

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

要了解更多信息,请参见Oracle教程。并在Stack Overflow中搜索许多示例和说明。规格为JSR 310

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

在哪里获取java.time类?

与哪个版本的Java或Android一起使用的哪个java.time库的表

ThreeTen-额外项目与其他类扩展java.time。该项目为将来可能在java.time中添加内容提供了一个试验场。你可能在这里找到一些有用的类,比如IntervalYearWeekYearQuarter,和更多

  • 值得注意的是,如果忽略“按字母顺序排序也是按时间顺序排序”,那么确实会引起严重的头痛_只有在亚秒时间被忽略时才是正确的_。一般来说,我发现像“SS.123Z”和“SSZ”(即“SS.000Z”)这样​​的东西都会出现,这会破坏字符串排序。 (3认同)
  • @JohnChris 时区的偏移量可以根据政客的心血来潮而改变。GMT 永远不会改变。某个地区可以选择使用与 UTC/GMT 的零小时-分钟-秒的偏移量作为其自己的时区的偏移量。稍后他们可能会选择遵守夏令时 (DST)。那时,他们与 UTC 的偏移量比 UTC/GMT 早一小时,有半年的时间。该地区的**决定不会改变格林尼治标准时间**,而是改变他们的时区。正如我在答案中所说,时区是特定地区的人们使用的偏移量的过去、现在和未来变化的历史。 (3认同)
  • 多谢。恕我直言,这是对日期时间相关编程问题的最佳评论之一。 (2认同)
  • @JustinP您的引用跳过了“1秒= 1/86400天的原始定义”部分。我们谈论的是零点几秒的差异。当差异漂移在几年内累积到一整秒时,负责的科学机构就会宣布出现[闰秒](https://en.wikipedia.org/wiki/Leap_second)。如果您正在进行常见的面向业务的编程,那么这种差异显然是无关紧要的。如果您正在研究 GPS/伽利略卫星信号或字面上的火箭科学,那么是的,这是有区别的。 (2认同)

小智 15

格林尼治标准时间(格林尼治标准时间)星期五,格林尼治标准时间(格林尼治标准时间)星期五7:17,格林尼治标准时间(UTC),格林尼治标准时间,格林尼治标准时间,格林尼治标准时间,格林尼治标准时间,格林尼治标准时间,格林尼治标准时间,格林尼治标准时间,格林尼治标准时间,格林尼治标准时间,格林尼治标准时间,格林尼治标准时间,格林尼治标准时间,格林尼治标准时间,格林尼治标准时间,格林尼治标准时间,格林尼治标准时间,格林尼治标准时间,格林尼治标准时间,格林尼治标准时间,格林尼治标准时间,格林尼治标准时间,格林尼治标准时间,格林尼治标准时间,格林尼治标准时间,格林尼治标准时间,格林尼治标准时间,格林尼治标准时间。

主要区别: UTC和GMT都是时间标准,它们的派生和使用方式都不同。

引用timeanddate.com

GMT和UTC之间的区别:

格林威治标准时间(GMT)通常与协调世界时(UTC)互换或混淆。但是GMT是时区,UTC是时间标准。

尽管实际上GMT和UTC在当前时间共享相同的时间,但两者之间存在根本的区别:

  • GMT是在某些欧洲和非洲国家中正式使用的时区。可以使用24小时格式(0-24)或12小时格式(1-12 am / pm)来显示时间。
  • UTC不是时区,而是作为全球民用时间和时区基础的时间标准。这意味着没有任何国家或地区正式使用UTC作为当地时间。

  • UTC 和 GMT 之间存在差异,因为它们的定义不同。使用闰秒将差异保持在一秒以内,但在某些情况下这仍然很关键,所以这个答案很糟糕。 (13认同)
  • @BasilBourque,你错了,从历史上看你是正确的,但经过一些研究,你会发现接受的答案是正确的。检查[此处](https://currentmillis.com/) (5认同)
  • **不正确。**`GMT'不是“时区”。GMT是定义世界各地胶印的传统标记。我们必须在地球上任意选择一个地点,以便说所有其他地点都在该地点之前或之后数小时-数分钟-秒。在现代历史上,那个随意的地方成为了格林威治,英国伦敦,英国,英国的皇家天文台,即“ GMT”中的“ G”。GMT不是时区,而是用于测量所有其他时区的度量。时区是特定地区人民使用的GMT偏移量(现在为UTC)的过去,现在和将来的历史记录。 (2认同)
  • @GrixM,你错了,从历史上看你是正确的,但经过一些研究,你会发现接受的答案是正确的。检查[此处](https://currentmillis.com/) (2认同)
  • @MarkDouglas 英国大陆使用“欧洲/伦敦”时区。目前,该区域在大约半年的 UTC (GMT) +00:00 零时分秒和半年的 UTC (GMT) +01:00 之前一小时之间交替。英国的其他地区使用具有不同偏移量的其他区域。 (2认同)

小智 6

GMT 是根据格林威治子午线计算的平均太阳时。https://www.rmg.co.uk/discover/explore/greenwich-mean-time-gmt

UTC 基于铯原子钟极其规则的“滴答声”。https://en.wikipedia.org/wiki/Cooperative_Universal_Time

它们既不是基于相同的时间,也不是以相同的方式计算。恕我直言, https://currentmillis.com上的措辞充其量是具有误导性的,即使不是完全错误。