PHP:周从星期一开始,但是星期日的“星期一星期一”将在下周一星期一开始

时间:2012-12-10 09:21:51

标签: php datetime

以下是该问题的摘要:星期日,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

10 个答案:

答案 0 :(得分:10)

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

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

答案 1 :(得分:6)

以下是本周的周一:

echo date("Y-m-d", strtotime(date('o-\\WW')));

答案 2 :(得分:6)

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

$thisMonday =  strtotime('next Monday -1 week', strtotime('this sunday'));

答案 3 :(得分:3)

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

if(date('N') == 7) { 
    $date = date('Y-m-d',strtotime('monday last week'));
} else {
    $date = date('Y-m-d',strtotime('monday this week'));
}

答案 4 :(得分: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.

度过愉快的一天。

答案 5 :(得分:0)

我认为不是尝试

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

你应该试试

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

答案 6 :(得分: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

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

答案 7 :(得分:0)

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

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

易于修改以使用DateTime,或甚至指定另一个日期作为基础。

答案 8 :(得分:0)

基于Bryant回答:

$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')));

答案 9 :(得分: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"));