【问题标题】:PHP: Week starts on Monday, but "monday this week" on a Sunday gets Monday next weekPHP:一周从星期一开始,但是星期日的“本周星期一”得到下周星期一
【发布时间】:2012-11-27 16:39:00
【问题描述】:

这里是问题的摘要:在星期日,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

【问题讨论】:

  • 也许有时区的恶作剧?你能用绑定到本地DateTimeZoneDateTime 试试这个吗?另外,您是否更换了服务器的磁通电容器?它们会在一段时间后磨损。 :p
  • 我认为 PHP 日期函数的第一天是星期天:w |星期几的数字表示 | 0(星期日)到 6(星期六)
  • @SalmanA,我也是这么想的,但是当我在网站上工作时,我一直注意到周一开始一周的开始。例如,date('Y-m-d', strtotime('this week'); 返回星期一的日期。 $format 参数的 week 部分下的大写 W 表示该周从星期一开始:php.net/manual/en/function.date.php italic_W | ISO-8601 年的周数,从周一开始的周数(在 PHP 4.1.0 中添加)_italic 我无法找到任何声明来证明 PHP 的周数从周一开始,除了未经证实的声明论坛和博客文章。
  • @Charles,我试过这个并得到了相同的结果:$date = new DateTime(); $date->setTimezone(new DateTimeZone('America/Los_Angeles')); $date->setTimestamp(strtotime('last sunday')); echo $date->format('Y-m-d'); 另外,我检查了一下,我服务器上的准电子通量率应该是......无限的。所以,我认为这不是问题所在。
  • 我在这里发布了一个错误报告:bugs.php.net/bug.php?id=63740 随时添加您的反馈。

标签: php datetime


【解决方案1】:

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

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

【讨论】:

  • 有点晚了,我也遇到了同样的问题...您可以通过 strtotime('next Monday -1 week'); 简单地解决此问题,这将始终为您提供本周的星期一;)
  • @FrederikVoordeckers 好主意!不适合我,但这样做:$this_date_start = new DateTime('next monday'); $this_date_start ->sub(new DateInterval('P7D'));
  • 这很好用@FrederikVoordeckers。但是周日我必须使用strtotime('sunday this week')
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    以下是获取本周星期一的方法:

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

    【讨论】:

    • 在星期一将返回上周星期一的日期。 echo date('Y-m-d', strtotime(date('o-\\WW'), strtotime('2013-02-18'))); 2013-02-18 是星期一。上面的代码回显2013-02-11,也就是前一个星期一。无论如何,当我向strtotime提供“本周”时,它并没有解释为什么 PHP 应该在未来返回一个日期@
    • 我刚刚使用了这个解决方案,如果基本时间戳也是星期一,则 strtotime(date('o-\\WW')) 返回相同的星期一。您使用的是哪个版本的 PHP?
    • @turibe,你的strtotime放错地方了,应该是:echo date('Y-m-d', strtotime(date('o-\\WW', strtotime('2013-02-18'))));
    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:
        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.
      

      祝你有美好的一天。

      【讨论】:

        【解决方案6】:

        我认为而不是尝试

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

        你应该试试

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

        【讨论】:

        • 如果我试图获取上周一的日期,这将起作用,但我想要做的是获取最近周一的日期,包括今天,如果今天是周一。 date('Y-m-d', strtotime('this week'); 返回星期一的日期,无论您在哪一天运行该代码或作为 strtotime 的第二个参数提供。
        • 也就是说我想得到一周的开始。但是,如果我尝试在星期天获得一周的开始,PHP 会返回一个未来的日期:即将到来的星期一。
        【解决方案7】:

        试试这个代码

        // 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
        

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

        【讨论】:

        • 我也在我的问题中展示了如何解决这个问题,但出于半学术目的,我想知道这是否是一个错误,或者 PHP 的行为是否有正当理由。我不明白那会是什么。如果这是一个错误,我需要报告它。但是这个专业的错误还没有被报告,这似乎很疯狂。
        • @turibe 如前所述,这不是错误。如果您选择使用word type 短语,PHP 会将星期一视为一周的开始。如果您希望它使用星期天作为一周的开始,您需要做一些变通方法。
        • @DainisAbols 我知道 PHP 认为星期一是一周的开始。我不想用星期天作为一周的开始。周日,strtotime('this week') 下周返回。这似乎是一个错误。
        【解决方案8】:

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

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

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

        【讨论】:

        • 您应该使用strototime('midnight today') 而不是time() 以保持一致性,因为last monday 在当天午夜返回。
        • @antriver 同意。我更新了我的评论以反映您的建议。最初的例子没有处理时间分量(只是 Y-m-d),所以这并不重要,但保持一致总是好的。
        【解决方案9】:

        基于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')));
        

        【讨论】:

          【解决方案10】:

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

          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"));
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-03-28
            • 1970-01-01
            • 2022-01-19
            • 1970-01-01
            相关资源
            最近更新 更多