时间戳

1,094 阅读3分钟

你会怎么解释什么是“时间戳”?

 

时间戳

一串10位或13位数的数字,表示秒(10位)或毫秒(13位)

是从1970年1月1日 00:00:00开始,经过的秒/毫秒数

如下所示,表示从1970/1/1 00:00:00 ——现在 ,经过了1711009880768毫秒

image.png  

为什么是1970/1/1 00:00:00

计算机系统中一般使用的是Unix时间戳(也有其他类型的时间戳存在,具体取决于应用程序或系统的需求,有些系统可能使用自定义的)

Unix时间戳为什么被广泛使用

image.png

1970/1/1 被称为“Unix时间原点”,是Unix操作系统的创建者选择的

因此Unix时间戳以1970年1月1日 00:00:00作为起始时间点

 

为什么获取1970/1/1 00:00:00的时间戳不是0

上面说了,时间戳是从unix原点到某一时刻,经过的秒/毫秒数 ,但为什么原点的时间戳不是0呢?

image.png

实际上,1970年1月1日00:00:00指的是协调世界时(UTC)

有兴趣可以拓展一下时区,本初子午线,格林尼治时间等地理知识

因此,准确的说,Unix时间戳以1970年1月1日 00:00:00 (UTC)作为起始时间点

 

但是,传给new Date 的1970/1/1 00:00:00 这个时间,是北京时间

image.png

1970-1-1 00:00:00 UTC (北京时间1970-01-01 08:00:00)

 

所以,我们想得到0时间戳应该是

image.png  

JavaScript中的new Date()函数返回的是当前的日期和时间,它会根据浏览器所在的时区来返回时间值。因此,在中国和美国使用new Date()得到的值是不同的,因为它们位于不同的时区。

如果希望获取的是标准时间(UTC时间),可以使用new Date().toUTCString()。这样可以避免受到不同时区的影响。

 

32位系统的2038问题

32位系统中,时间戳是一个32位的有符号整数

32位有符号整数是使用32个二进制位来表示的。对于有符号整数,最高位(最左边的位)通常被用来表示符号位,即0表示正数,1表示负数。

最大的32位有符号二进制是011111……1111(31个1),转换成十进制是2147483647

image.png

 

因此时间戳只能表示到,2038.1.19 11:14:07(北京时间)/ 2038.1.19 03:14:07(UTC)

系统时间超过2038.1.19 11:14:07,最高位从0变成1导致时间戳变成负数