你会怎么解释什么是“时间戳”?
时间戳
一串10位或13位数的数字,表示秒(10位)或毫秒(13位)
是从1970年1月1日 00:00:00开始,经过的秒/毫秒数
如下所示,表示从1970/1/1 00:00:00 ——现在 ,经过了1711009880768毫秒
为什么是1970/1/1 00:00:00
计算机系统中一般使用的是Unix时间戳(也有其他类型的时间戳存在,具体取决于应用程序或系统的需求,有些系统可能使用自定义的)
Unix时间戳为什么被广泛使用
1970/1/1 被称为“Unix时间原点”,是Unix操作系统的创建者选择的
因此Unix时间戳以1970年1月1日 00:00:00作为起始时间点
为什么获取1970/1/1 00:00:00的时间戳不是0
上面说了,时间戳是从unix原点到某一时刻,经过的秒/毫秒数 ,但为什么原点的时间戳不是0呢?
实际上,1970年1月1日00:00:00指的是协调世界时(UTC)
有兴趣可以拓展一下时区,本初子午线,格林尼治时间等地理知识
因此,准确的说,Unix时间戳以1970年1月1日 00:00:00 (UTC)作为起始时间点
但是,传给new Date 的1970/1/1 00:00:00 这个时间,是北京时间
1970-1-1 00:00:00 UTC (北京时间1970-01-01 08:00:00)
所以,我们想得到0时间戳应该是
JavaScript中的
new Date()函数返回的是当前的日期和时间,它会根据浏览器所在的时区来返回时间值。因此,在中国和美国使用new Date()得到的值是不同的,因为它们位于不同的时区。
如果希望获取的是标准时间(UTC时间),可以使用
new Date().toUTCString()。这样可以避免受到不同时区的影响。
32位系统的2038问题
32位系统中,时间戳是一个32位的有符号整数
32位有符号整数是使用32个二进制位来表示的。对于有符号整数,最高位(最左边的位)通常被用来表示符号位,即0表示正数,1表示负数。
最大的32位有符号二进制是011111……1111(31个1),转换成十进制是2147483647
因此时间戳只能表示到,2038.1.19 11:14:07(北京时间)/ 2038.1.19 03:14:07(UTC)
系统时间超过2038.1.19 11:14:07,最高位从0变成1导致时间戳变成负数