【问题标题】:php strtotime "last monday" if today is monday?如果今天是星期一,php strtotime“上星期一”?
【发布时间】:2011-05-08 05:13:46
【问题描述】:

我想使用strtotime("last Monday")

问题是,如果今天是星期一,它会返回什么? 它似乎正在返回上周星期一的日期。在这种情况下,我怎样才能让它返回今天的日期?

【问题讨论】:

    标签: php datetime strtotime


    【解决方案1】:

    正如previous answer 中正确概述的那样,这个技巧有效,但在PHP 5.6.22PHP 7.0.7PHP 7.1-dev 之前也有caveats

    strtotime('last monday', strtotime('tomorrow'));
    
    // or this one, which is shorter, but was buggy:
    strtotime('Monday this week');
    

    对于那些喜欢“Jedy-way”的人来说,使用the DateTime class 的对象,下一个解决方案是:

    (new \DateTime())->modify('tomorrow')->modify('previous monday')->format('Y-m-d');
    

    甚至更短的符号:

    \DateTime('Monday this week')
    

    要小心,因为如果你在 SQL 上做同样的事情,你不需要在 中加上“明天”来使用这些技巧。以下是解决方案的外观:

    SELECT DATE_SUB(CURDATE(), INTERVAL WEEKDAY(CURDATE()) DAY) as last_monday;
    

    【讨论】:

      【解决方案2】:

      如果您阅读手册,有一个很好的示例可以准确描述您想要做什么http://www.php.net/manual/en/datetime.formats.relative.php

      strtotime('Monday this week');
      

      更新:似乎在较新版本的 PHP 中引入了一个 错误,其中 this week 在星期日运行时返回错误的星期。您可以在这里对错误进行投票:https://bugs.php.net/bug.php?id=63740

      更新 2: 截至 2016 年 5 月 18 日,此问题已在 PHP 5.6.22、PHP 7.0.7 和 PHP 7.1-dev 中得到修复(希望在后续版本中保持修复),如此处所示:https://bugs.php.net/bug.php?id=63740#1463570467

      【讨论】:

      • 我不明白为什么另一个答案被接受了。对于更多读者来说,这个解决方案更好,它完全符合要求。
      • 非常有用,例如只能输入日期字符串的 Drupal 和视图。
      • 这是一段聪明的代码,但它可能没有被选中,因为它缺乏“概括”,这对于来自 Google 的人来说可能很重要。
      • @EralpB,这没什么好说的。它是 PHP 的核心,得到广泛支持,无错误,语义正确! :)
      • @Jose Garrido。也许是因为这个答案是 2 年后给出的?
      【解决方案3】:

      我的方法:

      date_default_timezone_set('Europe/Berlin');
      function givedate($weekday, $time) {
      $now = time();
      $last = strtotime("$weekday this week $time");
      $next = strtotime("next $weekday $time");
          if($now > $last) {
              $date = date("d.m.Y - H:i",$next);
          }
          else {
              $date = date("d.m.Y - H:i",$last);
          }
          return $date;
      }
      
      echo givedate('Wednesday', '00:52');
      

      或每月

          function givedate_monthly($weekday, $time) {
          $now = time();
          $last = strtotime("first $weekday of this month $time");
          $next = strtotime("first $weekday of next month $time");
              if($now > $last) {
                  $date = date("d.m.Y - H:i",$next);
              }
              else {
                  $date = date("d.m.Y - H:i",$last);
              }
              return $date;
      }
      
      echo givedate_monthly('Wednesday', '01:50');
      

      【讨论】:

        【解决方案4】:

        根据您使用它的确切用途,这可能很有用。由于一秒钟的歧义可以满足我的要求,因此我使用:

        date( 'Y-m-d 23:59:59', strtotime( 'last sunday' ))
        

        在最近的星期一(如果今天是星期一,则为今天)获得午夜。

        【讨论】:

          【解决方案5】:
          $monday = strtotime('Monday last week');
          $sunday = strtotime('+6 days', $monday);
          

          【讨论】:

            【解决方案6】:

            迟到的答案,但我想我会发布这个答案(这实际上来自一个不同但相关的问题)。它处理问题中的场景:

            function last_monday($date) {
                if (!is_numeric($date))
                    $date = strtotime($date);
                if (date('w', $date) == 1)
                    return $date;
                else
                    return strtotime(
                        'last monday',
                         $date
                    );
            }
            
            echo date('m/d/y', last_monday('8/14/2012')); // 8/13/2012 (tuesday gives us the previous monday)
            echo date('m/d/y', last_monday('8/13/2012')); // 8/13/2012 (monday throws back that day)
            echo date('m/d/y', last_monday('8/12/2012')); // 8/06/2012 (sunday goes to previous week)
            

            试试看:http://codepad.org/rDAI4Scr

            ... 或具有星期天的变体在第二天(星期一)而不是前一周返回,只需添加一行:

             elseif (date('w', $date) == 0)
                return strtotime(
                    'next monday',
                     $date
                );
            

            试试看:http://codepad.org/S2NhrU2Z

            你可以传递一个时间戳或者一个字符串,你会得到一个时间戳

            文档

            【讨论】:

              【解决方案7】:

              如果今天是星期一,strtotime("last Monday") 将返回过去 7 天的日期。你为什么不检查今天是不是星期一,如果是,返回今天的日期,如果不是,返回上周?

              这将是一种万无一失的方法。

              if (date('N', time()) == 1) return date('Y-m-d');
              else return date('Y-m-d', strtotime('last Monday'));
              

              http://us2.php.net/manual/en/function.date.php

              【讨论】:

              • 只是好奇,如果您的 if() 子句中是 Now, 8th 23:59:59.999 并且当解释器到达 return 子句时 - 它已经是 Now, 9th(星期二)怎么办? ;-)
              • 哈,我试图保持简短。就个人而言,我会先声明今天和上周一,然后进行比较以避免竞争条件。我更喜欢你从明天开始工作的方法。
              • 是的,竞态条件是要检测的最奇怪的错误。对不起,如果我的评论看起来很粗鲁。
              • 一点也不。别担心。
              【解决方案8】:

              在这种情况下如何让它返回今天的日期?

              伪代码:

              if (today == monday)
                  return today;
              else
                  return strtotime(...);
              

              顺便说一句,这个技巧也可以工作:

              strtotime('last monday', strtotime('tomorrow'));
              

              【讨论】:

              • @nute:好吧,我已经检查了所有可能的情况:任何中间工作日,以及边缘:周日和周一。所有返回预期结果。我认为没有问题,除了语义;-)
              • 另请参阅此问题的answer by dotjon,以获得更优雅的解决方案。
              • @Gopal Aggarwal:我记得当this in strtotime 指向现在你想要的东西时,有一些极端情况。虽然无法提供任何特定示例
              • @zerkms 抱歉,我不明白你的意思。请详细说明。
              • @Sarthaz 感谢您的提醒和链接。我希望你不是认真的。如果 PHP 作为一门语言和社区不能(或不能希望在合理的时间内)改进其核心功能,一旦 bug 被重现,那么也许我们应该听听“PHP 很烂”并转移到其他地方。
              猜你喜欢
              • 2011-12-05
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2016-10-08
              • 2023-01-19
              • 2018-05-24
              • 1970-01-01
              相关资源
              最近更新 更多