PHP strtotime 行为

PHP strtotime behaviour

下面的代码行returns在两个不同的服务器A和B上有两个不同的输出:

echo date("M Y", strtotime("2015-01"));
echo date("M Y", strtotime("2015-02"));

预期的输出是 "Jan 2015" 和 "Feb 2015",这在服务器 A 上是正确的。

但服务器 B 上的相同代码 returns 输出为 "Jan 2015" 和 "Mar 2015"。

调试时,我发现服务器B上的strtotime函数总是返回每个月当天(今天是29号)的时间戳,这就解释了为什么“2015-02”显示为"March 2015"(因为没有 Feb 29, 2015)。昨天,这段代码在两台服务器上返回相同的输出,因为 2 月 28 日是有效的并且正确地转换为 2015 年 2 月。

所以基本上,在服务器 A 上,有效代码是

 echo date("M Y", strtotime("2015-01-01"));
 echo date("M Y", strtotime("2015-02-01"));

在服务器B上,有效代码为

echo date("M Y", strtotime("2015-01-29")); //or, strtotime("2015-01-[current day]")
echo date("M Y", strtotime("2015-02-29"));

为什么这两个服务器之间存在这种差异?

这是 php 不同版本的问题。 php 5.2.7中有一个BC,来自documentation:

In PHP 5 prior to 5.2.7, requesting a given occurrence of a given weekday in a month where that weekday was the first day of the month would incorrectly add one week to the returned timestamp. This has been corrected in 5.2.7 and later versions.

Demo

服务器 A PHP > 5.2.7,服务器 B PHP < 5.2.7。