【发布时间】:2015-05-29 18:42:28
【问题描述】:
以下代码行在两个不同的服务器 A 和 B 上返回两个不同的输出:
echo date("M Y", strtotime("2015-01"));
echo date("M Y", strtotime("2015-02"));
预期的输出是“Jan 2015”和“Feb 2015”,这在服务器 A 上是正确的。
但服务器 B 上的相同代码将输出返回为“Jan 2015”和“Mar 2015”。
在调试时,我发现服务器 B 上的 strtotime 函数总是返回每个月当天(今天是 29 日)的时间戳,这就解释了为什么“2015-02”显示为“2015 年 3 月” (因为没有 2015 年 2 月 29 日)。昨天,自 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"));
为什么这两个服务器之间会有这种差异?
【问题讨论】:
-
时区差异。这是您不应该像这样滥用
strtotime()的众多原因之一。 -
@Sammitch 你速度很快... ;)
-
@Sammitch 我不认为这是时区问题。任何时区怎么可能与其他时区相差 29 天?正如我所提到的,它假设服务器 B 上的当月日期。
标签: php date unix datetime strtotime