strtotime在不同PHP环境下执行失败问题求助
问题原因分析及解决方案
这个问题的核心原因是PHP运行环境的位数(32位 vs 64位)差异导致的时间戳范围限制,具体拆解如下:
1. 时间戳的底层限制
PHP的strtotime()函数依赖于系统底层的时间戳实现:
- 在32位系统/32位编译的PHP中,时间戳是32位有符号整数,其有效范围是:
- 最小值:
-2147483648(对应UTC时间1901-12-13 20:45:52) - 最大值:
2147483647(对应UTC时间2038-01-19 03:14:07)
你测试的日期1901-04-05对应的时间戳是-2169331200,这个值小于32位有符号整数的最小值,会触发溢出,因此strtotime()返回false。
- 最小值:
- 在64位系统/64位编译的PHP中,时间戳是64位整数,范围极大(可处理从公元前292亿年到公元292亿年的时间),因此能正确解析
1901-04-05并返回对应的负时间戳。
2. 快速验证环境差异
你可以通过以下代码确认PHP的位数:
<?php echo PHP_INT_MAX;
- 若输出
2147483647,说明是32位PHP; - 若输出
9223372036854775807,说明是64位PHP。
你的开发环境(PHP7.1.16)应该是64位版本,而生产环境(PHP7.1.13/7.2)是32位版本,这就是结果差异的根源。
3. 解决方案:用DateTime类处理早于1970的日期
如果需要处理1970年之前的日期,建议使用PHP的DateTime类——它不依赖32位时间戳的限制,示例代码:
<?php $date = new DateTime("1901-04-05", new DateTimeZone("UTC")); var_dump($date->getTimestamp()); // 即使在32位环境中,也能正确返回-2169331200 var_dump($date->format('Y-m-d H:i:s')); // 直接格式化输出日期
内容的提问来源于stack exchange,提问作者Wav
相关产品推荐
相关产品推荐

