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.
服务器 A PHP > 5.2.7,服务器 B PHP < 5.2.7。
下面的代码行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.
服务器 A PHP > 5.2.7,服务器 B PHP < 5.2.7。