lifanxi
2016-07-22 09:18:03 +08:00
时间其实是个很复杂的东西,但是可以把它理解成是个自然流逝的东西,然后人为给每一秒(毫秒也行,单位不重要,取决于你需要精度)进行计数。
这个计数值在计算机领域通常可以用 Unix 时间戳来表示,在不考虑实现(变量位数)的前提下,这个计数值可以表示任意时间范围。所谓只能表示 1970-2038 是因为假设了只用有符号 32 位整型数的非负数部分对秒计数的原因。
所以,用一个足够长的有符号整数来表示任意时间是没有问题的。但这个数值本身并不具有“时区”的含义,时区只在把它转换为人类可读的表示方式时才要考虑的问题。
这个转换工作应该 100%交给操作系统去实现,而不应该自己土法按一年 365/366 年、每天 24 小时、每小时 60 分钟、每分钟 60 秒再加上时间偏移去计算,甚至前一天、后一天这种计算也应该用系统库去完成,而不要自己去做。
因为时间日期计算里有太多坑了,基本上 99.9%的程序员自己实现的版本不会比系统已有的版本要好。最简单的有闰年、复杂一点的时区和夏时制、再复杂一点有闰秒、更复杂一点是一些历史特殊情况(比如时区变更)。