请看下面这个帖子,你相信2038年是世界末日吗?试分析为什么手机日期设置出现这种怪事。

确实会发生这种情况

(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时间戳的标准来进行时间计算和表示的(千年虫问题)

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值