【问题标题】:strtotime() seems bugged with a special date [duplicate]strtotime() 似乎有一个特殊的日期 [重复]
【发布时间】:2014-12-09 01:06:08
【问题描述】:

我正在编写一个计算两个日期之间天数的函数。

奇怪的是,我在一个特殊的日子里有一种奇怪的行为。这是我的代码的一部分:

$startTimestamp = strtotime('25-10-2014');
$endTimestamp   = strtotime('28-10-2014');

for($i = $startTimestamp; $i <= $endTimestamp; $i = $i + (60 * 60 * 24))
{
    echo date("d-m-Y", $i).'<br />';            
}

这个例子给了我这个结果:

25-10-2014

26-10-2014

26-10-2014

27-10-2014

我不知道为什么日期“26-10-2014”出现了两次。

如果我尝试使用其他日期,例如:

$startTimestamp = strtotime('25-11-2014');
$endTimestamp   = strtotime('28-11-2014');

结果正确:

25-11-2014

26-11-2014

27-11-2014

28-11-2014

【问题讨论】:

  • 我试过了,得到了正确的警告......
  • 我猜你是欧洲人。请记住:这个月开始于冬季时间。
  • fr.wikipedia.org/wiki/Heure_d%27%C3%A9t%C3%A9 了解夏令时。法国时间在今年 10 月 26 日更改。

标签: php


【解决方案1】:

我会使用DateTime 类:

$startTime = new DateTime('25-10-2014');
$endTime   = new DateTime('28-10-2014');

do {
    echo $startTime->format('d-m-Y'), PHP_EOL;
} while($startTime->modify('+1 day') <= $endTime);

请注意,您可以在比较 DateTime 对象时使用 &lt;= 运算符。 DateTime::modify() 方法也知道夏令时问题。 (请注意,10 月 26 日的夏令时有所变化)

【讨论】:

    【解决方案2】:

    这可能是因为您的 PHP 配置的时区中的 DST(夏令时)。

    这意味着,如果你向前跳 24 小时,你仍然是同一天,因为一天是 25 小时。

    【讨论】:

    • 同意。最好让 php 通过使用 strtotime("+1 day) 而不是 60*60*24 自动处理它
    • 是的,他来自法国,10 月 26 日有夏令时开关 :)
    • 完美。它的工作原理是:for($i = $startTimestamp; $i &lt;= $endTimestamp; $i = strtotime('+1 day', $i))
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-12
    • 1970-01-01
    • 2012-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-20
    相关资源
    最近更新 更多