计算机系统中的时间戳

 原创    2023-03-20

这是一篇简单的笔记,整理下目前已知的不同计算机系统的时间戳计数标准。

如何表示时间,这是一个古老的问题。西方广泛采用以耶稣诞生之年计算的“公历纪年”,而在远古时中国,人们采用“天干地支”纪年法,用十天干和十二地支分别组合,每六十年循环一次;到近代时,还出现过以传说中黃帝即位之年为起始的“黄帝纪元”,以1912年为起始的“民国纪年”。

人们常常以某个重要的历史时刻作为起点,往后或往前计算时间。生活如此,在计算机系统中亦如此。下面是一些不同计算机系统中采用的时间戳标准。

UNIX 时间戳

UNIX时间戳(UNIX Time Stamp)为协调世界时(Universal Time Coordinated,即UTC)从1970年01月01日00时00分00秒到现在经过的总秒数,不考虑闰秒。UNIX时间戳为正数,表示1970年以后的时间;为负数则为1970年之前的时间。在早期的计算机系统中,由于使用32位数据存储UNIX时间戳,将可能出现Y2038问题:即在2038年01月19日03时14分07秒时,表示时间戳的32位数据中的低31位全部填满导致向符号位进位,此时系统时间会跳回到1970年或1901年。

为什么要从1970年算起?

UNIX系统的第一个版本是在1970年问世的,那个时候操作系统是32位的,用一个int存储精确到秒时间,最多可以表示约68.1年,这个存储范围如果是从公元元年开始计算的话显然是不够用。最早时人们甚至打算从1971年开始计算,综合存储范围,便于记忆等多方面考虑,最终选择以1970年开始计算UNIX 时间戳。

GPS时间

GPS时(GPST),是由GPS星载原子钟和地面监控站原子钟组成的一种原子时基准,起始时间为1980年1月6日零时。相应的还有北斗时(BDT),即北斗卫星导航系统采用的时间基准,起始时间为2006年1月1日零时。

操作系统时间

以iOS操作系统为例,NSDate等系统API采用的时间是基于2001年1月1日零时的,这个时间与UTC时间戳相差978307200秒,这也是NSTimeIntervalSince1970定义的由来:

#define NSTimeIntervalSince1970  978307200.0

对于绝大多数场景来说,为了方便计算,都会统一转换为UNIX 时间戳,开发者几乎不用过多关注不同系统的差异。

相关文章:

URL Decode中对于+号的处理
UTF-8 BOM EF BB BF 问题
gcc function __attribute__

发表留言

您的电子邮箱地址不会被公开,必填项已用*标注。发布的留言可能不会立即公开展示,请耐心等待审核通过。