Y2K38 漏洞是什么?
Y2K38,又称 Unix Millennium Bug, 这个漏洞将会影响到所有 32 位系统下用 UNIX
时间戳整数来记录时间的 PHP,及其它编程语言。一个整型的变量所能保存的最大时间为 2038 年 1 月 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
年刚好是这个数。
是的,这是 28
年以后的事情了。你们肯定有些人认为我是在忋人忧天。要知道世纪末的千年虫问题就是这样产生的。另外,我们在开发一些应用的时候,可能会用到未来的日期,比如一个
25 年期的长期存款,退休金和保险业的财务数据等。
64 位系统会受到影响吗?
理论上不会,如果你是在 64 位的操作系统下使用 PHP,你的程序应该不会受到影响。我强烈建议你进行一下测试。64
位系统下可以保存的日期最远日期是现在宇宙年龄的 21 倍~ 292 亿年。
如果你确认你的财务系统运行在 64 位系统上的话,你可以安稳的睡个大头觉了。
有其它的解决方法吗?
幸运的是,PHP 从 5.2 版本开始引入了一个 DateTime 的类 (5.1 中开始实验加入,5.3
版本中扩展了一些方法)…
$date = '2040-02-01';
$format = 'Y-m-d H:i';
$mydate2 = new DateTime($date);
echo '
正常时间:',
$mydate2->format($format),
'
';echo '时间溢出:',date('Y-m-d H:i',strtotime($date));
exit;
?>