奇怪的PHP日期增量

时间:2015-07-31 09:17:51

标签: php date timezone timestamp

我试图循环找到两个日期之间的周末,而且真的很奇怪。

我必须遵循我认为应该正常工作的代码。

$weekends = array();
// yyyy-mm-dd
$firstWeekend = '2015-09-04';
$lastWeekend = '2015-12-25';
$firstWeekendTime = strtotime($firstWeekend);
$lastWeekendTime = strtotime($lastWeekend);

$totalWeekends = 0;
for ($i = $firstWeekendTime; $i <= $lastWeekendTime; $i += (7 * 86400)) {
  $totalWeekends++;
  $weekends[date('Y-m-d', $i)] = array(
    date('Y-m-d', $i),
    date('Y-m-d', strtotime(date('Y-m-d', $i) . '+ 2 days'))
  );
}

EG。输出:

[2015-10-16] => Array
    (
        [0] => 2015-10-16
        [1] => 2015-10-18
    )

[2015-10-23] => Array
    (
        [0] => 2015-10-23
        [1] => 2015-10-25
    )

[2015-10-29] => Array
    (
        [0] => 2015-10-29
        [1] => 2015-10-31
    )

[2015-11-05] => Array
    (
        [0] => 2015-11-05
        [1] => 2015-11-07
    )

但这不正确导致2015-10-23之后的下周末是2015-10-30。 所以输出应该是这样的:

[2015-10-16] => Array
    (
        [0] => 2015-10-16
        [1] => 2015-10-18
    )

[2015-10-23] => Array
    (
        [0] => 2015-10-23
        [1] => 2015-10-25
    )

[2015-10-30] => Array
    (
        [0] => 2015-10-30
        [1] => 2015-11-01
    )

[2015-11-05] => Array
    (
        [0] => 2015-11-05
        [1] => 2015-11-07
    )

我最终通过设置默认时区并且不进行任何其他操作来实现它,它起作用了。

date_default_timezone_set('America/Los_Angeles');

有人能理解为什么没有时区这种增量会失败? 最奇怪的是它只能在2015-10-25左右失败。

我不想要其他选择来寻找周末...我只是想明白为什么它会像这样。

谢谢。

1 个答案:

答案 0 :(得分:0)

您只需要使用增量值更改for循环条件,就像这样

for ($i = $firstWeekendTime; $i <= $lastWeekendTime; $i = strtotime(date('Y-m-d', strtotime(date('Y-m-d', $i) . '+ 7 days'))))

而不是

for ($i = $firstWeekendTime; $i <= $lastWeekendTime; $i += (7 * 86400))