搞懂时区 、UTC、GMT、Unix 时间戳

前言

最近重构老项目,工作真的很忙,这个老项目的代码真的让人一言难尽......

很久没有写文章了,今天来学习一下 时区

可能大多数朋友和我一样以前都是做的国内项目,默认用的就是北京时区,所以不需要考虑这个问题。但是现在新公司做的是海外项目,所以掌握时区是很有必要的。希望通过这篇文章让大家熟悉时区。

为什么会有时差

假如我问你现在是几点,你会怎么回答?“现在是早上九点,阳光刚刚好!”,那么此时你默认的是北京时间,因为这个时候俄罗斯的莫斯科其实还是凌晨四点,太阳还没出来呢!由于地球是自西向东自转,东边比西边先看到太阳,所以东边的时间比西边的早,于是处于地球不同位置的国家就有时间的差异,东西距离越远的国家时差就越大。

为什么会有时区

如果你高中听过地理课的话,应该会有所了解。前面我们提到了东边比西边先看到太阳,所以每一条经线位置看到太阳都有先后差异,这也就导致了每一条经线上的时间都不一样。那么为了便于全世界不同地区的时间计算,就创造出了时区的概念。

时区的划分

也许你从未考虑过时区,但如果你觉得你做国内的项目你们没有用时区,那就大错特错了。因为你的时区默认用的都是北京时区。我相信你一定看过新闻联播吧!(如果没看过那你要认真反思了!)新闻联播每次都会体现出精确的时区:“欢迎收看新闻联播,现在是 北京时间 19:00 点整”。看下下面这张图先了解一下世界上所有的时区

地球是个近似球体,根据圆周 360° 将地球划分为 24 个时区,每个时区占 15°,以中央经线左右 7.5° 划分为一个时区。以本初子午线做为中(零)时区的中央经线,依次向东西划分。比如图中东八区,边界的正中间就是东八区的中央经线。

值得注意的是从图中我们可以看出,有的国家其实横跨了很多时区,比如由于我国版图之大旷古绝今!横跨了东时区 四、五、六、七、八、九 六个时区,那么这种情况一般是以国家首都所在时区为准。比如新疆理论上是东六区,但是也统一使用东八区北京时间!

简单来说呢就是,你现在看手机是早上九点,新疆朋友看手机也是早上九点,但是新疆那边可能天还没亮......

UTC

UTC(Universal Time Coordinated),协调世界时,又称世界统一时间、世界标准时间、国际协调时间。UTC 是现在全球通用的时间标准,全球各地都同意将各自的时间进行同步协调。

简单来说你可以理解为就是一个规范,所有国家都愿意遵守这个规范来计时,所有国家都用相同的规范,在时间的计算上面就方便很多。

GMT

GMT(Greenwich Mean Time), 格林威治平时(也称格林威治时间)。它规定太阳每天经过位于英国伦敦郊区的皇家格林威治天文台的时间为中午12点。

1972年之前,格林威治时间(GMT)一直是世界时间的标准。1972年之后,GMT 不再是一个时间标准了。

简单来说这也是一个规范,不过是 1972 年之前的,在这之后基本都使用 UTC 了,想比之下 GMTUTC 在精确到秒的时候是一样的,如果需要精确到秒级甚至以下单位需要使用 UTC

Unix 时间戳

这是基于 UTC 1970.01.01 00:00:00 到现在的总秒数/毫秒数,由于全世界都使用 UTC 为通用时间标准,所以这个总秒数/毫秒数全世界都是一样的,也就是说 Unix 时间戳和时区无关,你可以在两个不同时区的服务器执行以下 Java 代码来验证,得出的结果是相同的。

System.currentTimeMills();
复制代码

如果你没有国外服务器, 你可以使用 docker 运行两个容器,在环境变量中指定不同时区即可。

本地时间

在日常生活中所使用的时间我们通常称之为本地时间。这个时间等于我们所在(或者所使用)时区内的当地时间,它由与世界标准时间(UTC-0)之间的偏移量来定义。这个偏移量可以表示为 UTC-UTC+ ,后面接上偏移的小时。每往东一个时区就 +1 小时 ,每往西一个时区是 -1 小时,例如我们中国的北京时间相对于UTC-0的偏移量是 UTC+8

注意,在 PostgreSQL 中,UTC+、- 是相反的,UTC-8 代表的是相对于 UTC 加八个小时,反之减八个小时......

结语

我相信很多朋友和我一样之前都没有做过跨国项目,可能很少关注过时区相关的东西。这篇文章搞清楚了时区的基本知识,下一篇会为大家介绍 Java8 新一代时间 API

如果这篇文章对你有帮助,记得点赞加关注。你的支持就是我继续创作的动力!

猜你喜欢

转载自juejin.im/post/7032901688595841055