使用相对日期('本周')时strtotime()的奇怪行为

时间:2014-02-02 22:59:45

标签: php date strtotime

在处理相对日期格式时,我遇到了strtotime()函数的奇怪行为。

我住在一个国家,一周的第一天不是星期天而是星期一。这个事实应该反映在strtotime()的输出上。

问题是,无论我设置了什么语言环境(我也试过en_US语言环境),strtotime()只是怪异而且周一和周日似乎都不在本周的范围内。见下面的例子。

今天,2014-02-02(或02/02/2014,如果你愿意......多么美好的约会)是星期天。基于此,我试图获得本周的周一和周日日期。两人都没了。

<?php

    setlocale(LC_ALL, 'cs_CZ');

    $sunday = new DateTime('2014-02-02');

    echo '"Today" is Sunday, ' . $sunday->format('Y-m-d') . "\n";

    $thisWeekMonday = strtotime('monday this week', $sunday->getTimestamp());
    $thisWeekSunday = strtotime('sunday this week', $sunday->getTimestamp());
    echo "This week's Monday: " . date('Y-m-d', $thisWeekMonday) . "\n";
    echo "This week's Sunday: " . date('Y-m-d', $thisWeekSunday) . "\n";

?>

以上代码输出:

"Today" is Sunday, 2014-02-02
This week's Monday: 2014-02-03
This week's Sunday: 2014-02-09

如果strtotime()认为一周从星期日开始,它应该已经将2014-02-02作为'本星期日'返回,但事实并非如此。这意味着,根据strtotime(),一周从星期一开始。在这种情况下,“本星期一星期一”应该返回2014-01-27,但事实并非如此。

这种行为是不合逻辑的。这是一个PHP错误吗?难道我做错了什么?如果这是一个错误,解决此问题的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

很奇怪,这实际上似乎是一个错误。解决方法可能涉及检查“今天是星期天”。如下所示:

$thisWeekSunday = ($sunday->format('w') == 0) ? $sunday->getTimestamp() : strtotime('sunday this week', $sunday->getTimestamp());