36

这是问题的摘要: 在星期日,strtotime('this week')返回下周的开始。

在 PHP 中,一周似乎从星期一开始。但是,在除星期日之外的任何一天,此代码

echo date('Y-m-d', strtotime('monday this week', strtotime('last sunday')));

输出本周星期一的日期,看起来应该是上周的星期一输出。在这种情况下,PHP 似乎将星期日和星期一都视为一周的开始。现在是 2012 年 12 月 10 日星期一或 2012 年 12 月 10 日。date('Y-m-d', strtotime('sunday last week'))返回2012-12-09- 昨天。

这是一个错误,还是我错过了什么?看起来这个明显的错误应该是众所周知的,但我找不到任何关于它的信息。获得一周开始的唯一方法是在周日使用一些特殊处理吗?

$week_offset = (int) 'sunday' == date('l');
$week_start  = strtotime("-$week_offset monday"); // 1 or 0 Mondays ago
4

10 回答 10

10

据我所知,这是一个错误。我认为没有合理的理由strtotime('this week');应该返回未来的日期。这是一个相当大的错误。在我的特殊情况下,我有一个排行榜,显示自本周开始以来得分最高的用户。但是在星期天,它是空的,因为strtotime返回了未来日期的时间戳。我很怀疑,因为我不知道这怎么可能被忽视,但我找不到任何其他关于这个错误的报告。

感谢您的所有时间和帮助,伙计们。

于 2012-12-11T19:43:44.587 回答
7

这个答案很晚,但这是我一直在努力解决的问题。到目前为止,我尝试过的每个解决方案都因某种原因而出现故障。这就是我最终得到的对我有用的东西。(虽然它可能看起来很漂亮,但它至少有效)。

$thisMonday =  strtotime('next Monday -1 week', strtotime('this sunday'));
于 2015-09-15T11:19:26.973 回答
6

以下是如何获得本周的星期一:

echo date("Y-m-d", strtotime(date('o-\\WW')));
于 2013-02-16T22:07:40.820 回答
3

这并不理想,但这就是我使用的方法:

if(date('N') == 7) { 
    $date = date('Y-m-d',strtotime('monday last week'));
} else {
    $date = date('Y-m-d',strtotime('monday this week'));
}
于 2015-06-14T13:55:43.953 回答
1
  I think the only problem with your coding is TimeZone.

解决方案:
设置自己的时区。这是我自己的时区的示例:

例子

   date_default_timezone_set('Asia/Kolkata');


   Set the above line before calling any time function.

祝你今天过得愉快。

于 2014-01-18T22:36:40.543 回答
0

试试这个代码

// set current date
$date = date("m/d/Y");
$ts = strtotime($date); // also $ts = time();

// find the year and the current week
$year = date('o', $ts);
$week = date('W', $ts);
// print week for the current date
$i = 1; // 1 denotes the first day of week

$ts = strtotime($year.'W'.$week.$i);
echo $day = date("l", $ts); // generate the name of day
echo "<br>";
echo $day = date("Y-m-d", $ts); // generate the date

你会得到本周的日期,无论你是在星期一,你都会得到那个星期一的日期。

于 2012-12-11T05:31:45.900 回答
0

如果你想要最近的星期一:

function mostRecentMonday(){
  if(date("w") == 1){
   return strtotime("midnight today");
  } else {
   return strtotime("last monday");
  }
}

易于修改以使用 DateTime,或者甚至指定不同的日期作为基准。

于 2014-01-16T16:50:06.197 回答
0

我想而不是尝试

echo date('Y-m-d', strtotime('monday this week', strtotime('last sunday')));

你应该试试

echo date('Y-m-d', strtotime('monday last week'));
于 2012-12-10T10:06:21.590 回答
0

这适用于寻找适合任何一天的友好解决方案的人。

function getWeekStart($week_start_day = "Monday") {
    $week_days = array("Sunday"=>0,"Monday"=>1,"Tuesday"=>2,"Wednesday"=>3,"Thursday"=>4,"Friday"=>5,"Saturday"=>6,);

    if(!isset($week_days[$week_start_day])) {
        return false;
    } else {
        $start_day = $week_days[$week_start_day];

        $today = date("w");
        $one_day = (60 * 60 * 24);

        if($today < $start_day) {
            $days_difference = 7 - ($start_day - $today);
        } else {
            $days_difference = ($today - $start_day);
        }

        $week_starts = strtotime(date("Y-m-d 00:00:00")) - ($one_day * $days_difference);

        return $week_starts;
    }
}

//Test: If today is Monday, it will return today's date
echo date("Y-m-d H:i:s", getWeekStart("Monday"));
于 2018-05-26T12:39:42.240 回答
0

基于布莱恩特的回答:

$first_week_date = date('d F Y', strtotime('next Monday -1 week', strtotime('this sunday')));
$last_week_date = date('d F Y', strtotime('next Monday -1 week + 6 days', strtotime('this sunday')));
于 2017-07-20T18:19:20.450 回答