php strtotime 2038 时间戳,PHP的strtotime计算2038年以上日期的时间戳错误

今天同事遇到一个bug,获取有效期值错误,同样的代码,其他开发人员操作都没有问题。在定位跟踪后发现有效期有值,如下:

$expireDate = 2133999048;        但是在该时间戳的基础上加上1 year后, $expireDate的值为false,而不是正确的时间戳。

$expireDate = strtotime("+1 year", $expireDate);        于是将时间戳改为天数并不断寻找最终的边界在+156 days可以正常返回,超过后就无法正常返回。于是将时间戳转换成正常格式的时间

echo date("Y-m-d", $expireDate);       显示日期为2038-01-19。网上搜索一下,说是32位的unix时间戳漏洞,称为Y2K38 漏洞。64位的系统不受此影响。

Y2K38 漏洞

Y2K38,又称 Unix Millennium Bug,此漏洞将会影响到所有 32 位系统下用 UNIX 时间戳整数来记录时间的 PHP,及其它编程语言。 一个整型的变量所能保存的最大时间为 2038 年01月19 日 03:14:07。超过这个时间后,整型数值将会溢出。 从 1970 年 01 月 01 日开始,到世界标准时 2038 年 01 月 19 日星期二凌晨 03:14:07 超过 2^31 – 1。2^31 – 1 就是0x7FFFFFFF,相信很多编程员都看过,在 32 位系统里,这表示最大的有符号整数。如果用它来表示秒数,大概相当于 68.1 年,从 1970 年到 2038 年刚好是这个数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值