strtotime php函数表现不如预期

时间:2011-08-22 01:41:13

标签: php date strtotime epoch

我正在尝试编写一些php来确定给定工作日下一次出现的日期(Y-m-d格式)。

date('Y-m-d', strtotime('next monday'));

正在返回

2011-08-29

而不是

2011-08-22

在我的服务器上。不知道为什么。我的服务器是亚马逊美国东海岸数据中心的EC2实例,目前是2011-08-21 9:40:00。

编辑1 date('Y-m-d', strtotime('next sunday'));也会返回2011-08-28而不是今天。我在http://writecodeonline.com/php/上尝试了这段代码......开始认为测试人员不准确。

4 个答案:

答案 0 :(得分:2)

仅仅因为您的服务器设置为某个时区并不一定意味着PHP将在同一时区上运行。它已于2011年8月22日星期一在欧洲,其中还包括UTC。如果你的PHP在这个时区上行动,“下周一” 将是8月29日。

您应该仔细检查PHP中的时区设置。您可以运行date_default_timezone_get()来检查您的安装使用的设置,或者尝试强制您的PHP脚本使用您期望的date_default_timezone_set("America/New_York");时区,看看您是否得到了您期望的结果。

我刚试过这个:

date_default_timezone_set("America/New York");
echo date('Y-m-d', strtotime('next monday')); // prints 2011-08-22
date_default_timezone_set("UTC");
echo date('Y-m-d', strtotime('next monday')); // prints 2011-08-29

答案 1 :(得分:0)

您使用的是哪个版本的PHP?在某些版本的PHP strtotime中确实存在错误行为。

我在strtotime手册页中找到了:

  

5.0.2 在PHP 5到5.0.2之间,“现在”和其他相对时间从今天的午夜错误地计算出来。这与从当前时间正确计算的其他版本不同。

     

5.0.0 开始允许微秒,但忽略它们。

     

4.4.0 在4.4.0之前的PHP版本中,“next”被错误地计算为+2。对此的典型解决方案是使用“+1”。

您描述的行为表明您的版本介于 5.0 5.0.2 之间。

我建议您检查今天和计算的“下一个星期一”之间的差异是否高于7天。如果是,则减去7天,并且您有实际日期。

尝试使用该代码:

$days = ((strtotime('next monday') - time()) / 60 / 60 / 24);
if ($days >= 8) {
  $days -= 7;
}

我知道有date_diff功能,但如果您的PHP版本太低,我认为它不适合您(抱歉,只有5.3.0及更高版本)。

答案 2 :(得分:0)

我认为这是预期的行为,因为周一没有通过strtotime将其视为下周一。

答案 3 :(得分:0)

“下一步”,与工作日一起使用时,通常表示下一个最接近的一个之后的第一个。例如,如果今天是21日星期日,那么“下一个”星期一不是明天22日,而是下周一29日。

我知道这不一定是直观的,也不是普遍认可的,但我相信这就是strtotime()解释“下一步”的方式。

编辑:我已经通过我自己的测试证实我不正确,并且“下一个”应该返回第一个即将到来的工作日(上面的例子中的第22个)。我将这里的答案保留为未经编辑,以下评论可能对其他人有所帮助。