最近需求涉及到不同时区的时间展示,发现自己对于时间戳的理解存在误差。
Unix 时间戳是从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数,不考虑闰秒。
UNIX时间戳的 0 按照 ISO 8601 规范为 :1970-01-01T00:00:00Z.
简单来说,时间戳是当前时间距离 1970-01-01T00:00:00Z 有多少秒。
比如,当前时间为 2022年7月6日10点32分50秒,故这个时间点对应的时间戳为 1657074770
2022年7月6日10点32分50秒 - 1970年1月1日0点0分0秒 = 1657074770 (秒)
这里忽略了两个东西,1970-01-01T00:00:00Z 中,字母T和字母Z是什么含义呢?
根据 ISO 8601中规定:
1、对UTC时间最后加一个大写字母Z
例如:UTC时间下午2点30分5秒表示为14:30:05Z
2、日期和时间的合并表示时,要在时间前面加一大写字母T
例如:北京时间2004年5月3日下午5点30分8秒,可以写成2004-05-03T17:30:08+08:00
所以,字母T是一种固定的表示方式,可以忽略;而UTC时间是什么意思呢?
UTC为世界标准时间;人为划定一个区域的时间为标准时间。
例如:北京时间 2004-05-03T17:30:08+08:00,其中的+08:00为+8小时,就是相对与标准时间再+8小时
回到时间戳的定义上,时间戳定义为两个时间点的秒数差,那么两个时间点的 时区一致 才能做减法,例如:
在国内获取的当前时间为 2022-07-06 11:19:31,更标准的表示为 2022-07-06T11:19:31 +08:00
在国内计算时间戳时的时间起点为 1970-01-01T00:00:00 +08:00
时间戳 = 2022-07-06T11:19:31 +08:00 - 1970-01-01T00:00:00 +08:00
而不是 2022-07-06T11:19:31 +08:00 - 1970-01-01T00:00:00Z