【问题标题】:PHP strtotime behaviourPHP strtotime 行为
【发布时间】: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


【解决方案1】:

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

在 PHP 5 5.2.7 之前的版本中,请求给定的给定事件 一个月中的工作日,该工作日是该月的第一天 会错误地将一周添加到返回的时间戳。这有 已在 5.2.7 及更高版本中更正。

Demo

服务器 A 的 PHP > 5.2.7,服务器 B 的 PHP

【讨论】:

  • 您对服务器上的 PHP 版本是正确的。虽然我不明白文档。 strtotime 的输入仅为“2015-02”,那么为什么要将当前日期添加到此?文档说它会错误地将返回的时间戳添加一周,但在这种情况下它超过了 4 周。
  • 我真的对此一无所知。还有更奇怪的行为,在 php
猜你喜欢
  • 1970-01-01
  • 2017-08-29
  • 1970-01-01
  • 2014-02-28
  • 2013-06-09
  • 2012-01-27
  • 2012-12-02
  • 2014-12-25
  • 1970-01-01
相关资源
最近更新 更多