确实会发生这种情况
(oppo 的color12os)
安卓系统是在Linux内核的基础上构建的,采用的时间戳是基于32位Unix格式。可以根据这个链接查看Unix 时间戳时间戳(Unix timestamp)转换工具 - 在线工具 (tool.lu)
原因:
这种格式将时间表示为从1970年1月1日0时0分0秒开始的秒数,按秒为单位进行增减。我们现在使用的安卓、苹果系统都属于类Unix系统,采用了同样的方案,其中有符号数用补码来表示。
而32位机器中所能表示的最大整数(有符号数)的值为2^31 -1(二进制表示为011......111),即2147483647,此时如果再增加1,数据就会出现“装不下”的情况,发生溢出,符号位由0变为1,二进制表示就会变成(100......000),其对应的原码为-2^31,即-2147483648。1970年1月1日00:00:00 + 2147483647秒 = 2038年1月19日 3点14分7秒,因此下一秒就会变成1970年1月1日00:00:00 - 2147483648秒=1901年12月13日20时45分52秒
不愧是反方向的钟啊(doge)
解决方法:
1.将系统中的时间表示从32位Unix时间戳转换为64位Unix时间戳。使用64位时间戳可以显著延长时间范围,相当于计算机由32位变为64位所带来内存的显著变化,它可以表示更大的整数值,可以表示的时间范围大约是从公元前292亿年到公元292亿年,从而避免了32位时间戳的限制。
2.使用支持更大时间范围的日期和时间库,直接改变初始时间是不太可行的,需要修改系统的底层实现和许多相关的应用程序和库,很多系统和软件都是基于Unix时间戳的标准来进行时间计算和表示的(千年虫问题)