什么是 GMT 和 UTC,他们之间的区别是什么?
GMT(Greenwich Mean Time)和UTC(Coordinated Universal Time)是两个不同的时间标准,但它们非常相似并且通常被混淆使用,那他们之间的区别在哪呢 ?
GMT指的是格林威治标准时间(Greenwich Mean Time),是以英国伦敦的格林威治区为基准的世界时间标准。它是一个世界范围内通用的标准时间,不受夏令时或其他因素的影响。GMT通常用于航海、航空、科学、天文等领域,也被广泛用于全球性的网络和软件系统中作为标准时间。它通常使用24小时制,以时、分和秒的形式表示时间 (GMT最初是由英国皇家海军用作全球通信和导航的基准时间标准,它以英国伦敦的本初子午线上的太阳穿越点为参考点。因此,GMT也被称为伦敦时间)。
UTC 全称为 “Coordinated Universal Time” 中文翻译为 —— 协调世界时,或称为 世界统一时间、世界标准时间、国际协调时间 —— 它由国际原子时(TAI)和旋转地球服务(UT1)的平均值计算得出的。是国际电信联盟(ITU)制定和维护的标准时间。UTC基于原子钟而不是地球自转来确定时间,因此它比GMT更准确。
在实际使用中,GMT和UTC之间的差别通常很小,并且在大多数情况下可以互换使用。但是,由于UTC比GMT更准确,许多人现在更倾向于使用UTC。
题外话: GMT的分别是Greenwich Mean Time三个单词的首字母缩写,那为什么 Coordinated Universal Time 的缩写叫 UTC 呢?不应该是 CUT 吗?
哈哈,原来 UTC 的缩写源于法语 —— “Temps Universel Coordonné”,因为法文中“temps”和“universel”之间有一个 “e” 音,所以选择了“UTC”作为缩写。此外,“Universal Time”(通用世界时)这个词汇已经有一个相对应的缩写 UT,所以在缩写 UTC 中采用了字母 “C”,表示为“coordinated”。
假设我们有一个UTC时间,我该怎么使用呢?
地球上的各个国家都被划分在了不同的时区里,我们可以把UTC时间理解成一个基准,时区相当于一个偏移量,所有国家的时间都可以根据这个基准时间从左或从又偏移(分别对应加上或减去对应的时区数)
简言之 —— 通过 UTC 时间加上任何国家的时区得出就是那个国家的时间
—— 比如现在的 UTC 时间是2023年5月10日10:00:00,那么北京时间就是UTC+8,也就是2023年5月10日18:00:00。同样,纽约的时区是UTC-4,所以在纽约现在的时间是UTC时间减去4个小时,也就是2023年5月10日06:00:00这里用 Java 举一个最简单UTC时间转换例子
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
/**
* Author: 削尖的螺丝刀
*/
public class UTCTimeExample {
public static void main(String[] args) {
// UTC时间字符串
String utcTime = "2023-05-10T14:30:00Z";
// 将UTC时间字符串解析为Instant对象
Instant instant = Instant.parse(utcTime);
// 将Instant对象转换为本地时间
LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
// 格式化为另一个字符串
String formattedTime = localDateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
// UTC基准时间: 2023-05-10T14:30:00Z
System.out.println("UTC时间字符串:" + utcTime);
// 输出结果(本地时间为东八区,所以偏移量加8得出): 2023-05-10 22:30:00
System.out.println("本地时间字符串:" + formattedTime);
}
}
可能有小伙伴又会好奇问了 —— "2023-05-10T14:30:00Z" , 为什么要用这样的字符串才行?它代表什么意思呢?
—— 其实这是 ISO 8601 国际标准化组织(ISO)定义的标准时间格式,它规定了如何用数字表示日期、时间和时间间隔,以及如何表示日期和时间的组合。其主要目的是确保日期和时间格式的一致性,以方便跨越国际边界的信息交流和处理。
ISO 8601格式可以表示年、月、日、小时、分钟、秒、时区和时间间隔。日期和时间之间使用字母“T”分隔。例如,2023年5月10日下午3点30分45秒的ISO 8601表示为“2023-05-10T15:30:45”。如果需要表示时区,可以在时间后面加上一个偏移量,如“+08:00”表示东八区 —— “2023-05-10T15:30:45+08:00”,加上时区之后这里就是东八区时间了,而 UTC 时间怎么表示呢? 想必你也猜到了,就是后面+0时 —— `2023-05-10T14:30:00+00:00` 当然 也可以用 `2023-05-10T14:30:00Z` (也就是上面代码中的例子)表示
这里给出国际化服务场景下,处理不同时区问题时的一些建议:
-
使用标准的时间格式:使用标准的时间格式,如ISO 8601,可以确保所有人都能够理解和解析时间戳。ISO 8601格式的时间戳类似于这样:YYYY-MM-DDTHH:MM:SSZ,其中T表示时间分隔符,Z表示UTC时间。
-
存储和传输时间戳时,使用UTC时间:使用UTC时间作为标准时间可以避免因为不同时区而出现的时间差问题。
-
在用户界面上,将UTC时间转换为用户所在时区的本地时间:将UTC时间转换为本地时间可以提高用户体验,让用户更加容易理解时间戳。可以使用编程语言提供的日期时间库或第三方库来进行转换。
-
了解不同时区的时差:在处理不同时区的时间问题时,需要了解不同时区之间的时差,以便在计算时间差和转换时间戳时进行正确的计算。
-
建立良好的沟通和协作机制:在一个国际化的微服务体系中,需要建立良好的沟通和协作机制,以确保在处理时间问题时能够顺畅地进行交流和协作。
比如在一个国际化的电商平台中,可以将所有时间戳都存储为UTC时间,同时将用户界面上的时间戳转换为用户所在时区的本地时间。此外,也可根据实际场景和需求,在系统中记录用户所在的时区信息,并在系统中使用正确的时区来计算和显示时间戳。在沟通和协作方面,可以建立一个明确的时间协调机制,以确保不同团队之间能够顺畅地进行交流和协作。
题外话: ISO 8601 格式 UTC 字符串中的 Z 是什么含义? —— 由此引申出对NATO国际音标通讯代码的介绍
可能又有好奇的小伙伴会问了,既然 T 表示 Time ,那 Z 是否就小时 Zero 呢?
—— 哈哈,为了方便记忆,螺丝刀本人当然是认为可以的,但为了尊重原意,螺丝刀特意去搜寻了一番,原来这个字母 Z 的背后大有来头,它的全拼为 Zulu —— 其作为时区表示方式的名称起源于北约(NATO)标准,在这个标准中,每个字母代表一个特定的时区,并以字母表中的顺序来排列。"Zulu"是字母表中最后一个字母,代表的是0时区,也就是格林威治标准时间(GMT)。因此,"Zulu"成为了表示格林威治标准时间的简便方式。此外,"Zulu"这个单词在英语中也有"最终"或"最后"的意思,符合其代表0时区的含义。
—— 然而更有趣的是,在螺丝刀英语学习过程中也见过这个 NATO(北约) 国际通讯码,其在一些日常生活也常有用到它的场景,比如 —— 订酒店的时候会用到这个音标通讯码来报自己的英文名字,尤其是在电话或无法面对面交流的情况下。因为不同的人可能来自不同的国家,使用本国语言的发音会导致交流困难,而NATO音标则是一种标准的国际通用语音符号,因此能够在跨国交流中起到很好的辅助作用。在国际航空业中也常使用NATO音标来进行通讯,以确保准确性和清晰度。
是不是觉得这次收获不少? 学习了 UTC 和 GMC 的同时,还学会了一个生活技巧!
下面螺丝刀把 NATO(北约) 国际通讯码 列出来供大家学习记忆 (说白了就是字母 A-Z 通过一个单词念出来,就和你在电话里诉别人你姓张,张飞的张,一个道理)
🎏 童鞋你学废了吗? 如果觉得有用,欢迎点赞三连,最后 —— 祝儿童节快乐 ~