strtotime奇怪的行为时 - 登录偏移

时间:2017-07-03 14:29:33

标签: php strtotime

从下面一行 -

$date = strtotime('-' . (-100) . ' years');

当我在本地代码上尝试此操作时,我得到一个值4654765319。在实际网站上尝试时,同一行的值$dateNULL。这一行不包含任何变量,因此没有其他代码影响它。

如果删除减号-i.e

,我在本地和实时都会得到正确的值
$date = strtotime('-' . (100) . ' years');

在两种情况下都给出相同的输出-1656664323

有人能说出strtotime()-符号的两个平台上行为不同的原因吗?

感谢。

2 个答案:

答案 0 :(得分:3)

很可能,您运行的是32位版本的PHP。请注意PHP documentation

  

时间戳的有效范围通常是从星期五,1901年12月13日20:45:54 UTC到星期二,2038年1月19日03:14:07 UTC。 (这些是与32位有符号整数的最小值和最大值相对应的日期。)

您可以使用PHP的DateTime类:

$date = new DateTime();
$date->modify('-' . (-100) . ' years');

echo $date->format('U');

eval.in

这是一个明确的问题再现:

eval.in

答案 1 :(得分:0)

<?php
echo '-' . (-100) . ' years'."\n";
echo '-' . (100) . ' years'."\n";

将打印出来

--100 years
-100 years

第一个显然是错误的日期字符串,strtotime man page表示该函数将返回FALSE,结果看起来像NULL,因此您的实际网站工作正常。我不知道为什么你的本地机器不会给出相同的结果 - 比较两台机器之间的配置 - 它们是否运行相同的操作系统和版本?

乔治在下面的提交后,我在我的64位机器上写了一个更完整的测试程序:

<?php
echo '-' . (-100) . ' years'."\n";
echo '-' . (100) . ' years'."\n";
echo ($d1=strtotime('-' . (-100) . ' years'))."\n";
echo ($d2=strtotime('-' . (100) . ' years'))."\n";
echo date('Y-m-d',$d1)."\n";
echo date('Y-m-d',$d2)."\n";
打印出来的

--100 years
-100 years
4654771244
-1656662356
2117-07-03
1917-07-03

我之前从未尝试过,但显然strtotime()--100解释为-(-100) +100 - 所以我要说你的直播< / em> site是一个无法正常工作的站点,可能是因为它是一个32位环境。