1

我有两个具有不同操作系统的 Web 服务器。

SERVER 1在带有 LAMP Server 的 Centos 5 中运行。PHP 版本 5.3.21

SERVER 2在带有 LAMP Server 的 openSUSE 11.3 中运行。PHP 版本 5.3.5

两个 PHP 配置是相同的。有些是默认的。

我有一个包含如下代码的 php 文件:

<?php
/* TEST STRTOTIME */
echo "<br /><br />".strtotime("2038-01-01");
echo "<br /><br />".strtotime("2039-01-01");
?>

当我在SERVER 1中运行此文件时,结果是:

2145934800

2177470800

但是当我在SERVER 2中运行这个文件时,第二次转换不会产生任何东西。只显示结果是:

2145891600

为什么两台服务器上的转换结果给出不同的值​​​​ 而同一个文件。为什么在SERVER 2上无法在上述日期2038-01-01转换?这个问题有解决方案吗?

4

3 回答 3

8

您的远程服务器可能是 32 位的。您将需要一个 64 位服务器来处理大约2038之后的日期。

原因是您的远程服务器将其整数存储为带符号的 32 位整数。可以存储为有符号 32 位整数的最大数是2,147,483,647( 2^31 - 1)。由于这个数字是 1970 年 1 月 1 日(Unix 纪元)之后的秒数,你可以看到这个数字最终会被耗尽(如果没有检查边界,可能会溢出)。

例子

图片来源:维基百科

于 2013-04-03T04:26:52.277 回答
4

手册中DateTime

日期和时间信息在内部存储为 64 位数字,因此支持所有可能有用的日期(包括负年份)。范围从过去约 2920 亿年到未来相同。

此外,strtotime()有太多的不一致是可靠的。我总是建议DateTime改用。

$dt = DateTime::createFromFormat('Y-m-d', '2039-01-01');
echo $dt->getTimestamp();
于 2013-04-03T04:34:33.553 回答
0

您可以检查服务器的时区。

您也可以使用该date_default_timezone_set('UTC');命令设置默认时区。

希望这可以帮助。

于 2017-03-21T10:22:15.980 回答