【问题标题】:how to get the date of last week's (tuesday or any other day) in php?如何在php中获取上周(星期二或任何其他日期)的日期?
【发布时间】:2009-02-02 08:24:30
【问题描述】:

我认为这是可能的,但我想不出合适的算法。

我想做的是:

如果今天是 2009 年 2 月 2 日星期一,我怎么知道上周星期二的日期?两天后使用相同的代码,我会找到上周星期二的相同日期,当前日期是 2009 年 2 月 4 日星期三。

【问题讨论】:

    标签: php date


    【解决方案1】:

    这些答案中的大多数要么太多,要么在技术上不正确,因为“上周二”并不一定表示上周的周二,而只是表示上周二,可能在“现在”的同一周内。

    正确答案是:

    strtotime('tuesday last week')
    

    【讨论】:

    • @STTLCU 是的,我不知道为什么投票最高的那个被认为是正确的,如果你在星期三运行它,它基本上会返回昨天的星期二,而不是上周的,这不是 OP要求
    • 我同意@STT LCU。这应该是公认的答案,因为我遇到了与昨天出现的“上周一”相同的问题
    • 工作得很好。
    【解决方案2】:

    我知道已经有一个可接受的答案,但恕我直言,它不符合要求的第二个要求。在上述情况下,如果在星期三使用 strtotime 将在昨天产生。所以,确切地说,你仍然需要检查这个:

    $tuesday = strtotime('last Tuesday');
    // check if we need to go back in time one more week
    $tuesday = date('W', $tuesday)==date('W') ? $tuesday-7*86400 : $tuesday;
    

    正如 davil 在他的评论中指出的那样,这是我的快速拍摄。由于夏令时,上述计算每年将减少一次。足够好的解决方案是:

    $tuesday = date('W', $tuesday)==date('W') ? $tuesday-7*86400+7200 : $tuesday;
    

    如果你需要时间是 0:00h,当然你需要一些额外的努力。

    【讨论】:

    • 由于 DST 切换,当星期日只有 23 小时时(生成的时间戳将是星期一 23:00),这将不会在每年 1 周内起作用。将“7*86400”替换为“7*86400 + 7200”。当然,在这种情况下,时间并不总是 0:00,但日期将是 DST 安全的!
    • 你说得对,这有点快。感谢您指出这一点!
    • 谢谢你,直到今天(现在是星期三)我才注意到它T_T我现在欠你更多呵呵
    • @cg OP要求上周二,而不是上周二,这可能是本周(如果今天是周三,“上周二”将是昨天,而不是上周二) ,因此它是不正确的。我在下面提到的正确和准确的答案是 strtotime('tuesday last week')
    • 好的,所以我的回答毕竟是正确的,如果可能不那么简洁的话。在这些情况下,它确实会产生上周的星期二。你读过吗?
    【解决方案3】:

    PHP 实际上让这变得非常简单:

    echo strtotime('last Tuesday');
    

    请参阅strtotime 文档。

    【讨论】:

    • T.T 为什么我没有在文档中看到 T.T 非常感谢我欠你的
    • 这实际上并没有给你“上周的星期二”,而是最后一个星期二(可以是同一周......如果是星期五)
    • 完全是@garyee - 在下面查看我的答案
    【解决方案4】:

    工作解决方案:

    $z = date("Y-m-d", strtotime("last Saturday"));
    $z = (date('W', strtotime($z)) == date('W')) ? (strtotime($z)-7*86400+7200) : strtotime($z);
    print date("Y-m-d", $z);
    

    【讨论】:

      【解决方案5】:

      你忘记了日期第二个参数的 strtotime('W', $tuesday) 嗯。

      将 $tuesday 转换为 "$tuesday-7*86400+7200" 之前的时间戳

      mde.

      【讨论】:

        【解决方案6】:
        // test: find last date for each day of the week
        foreach (array('Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun') as $day) {
            print $day . " => " . date('m/d/Y', last_dayofweek($day)) . "\n";
        }
        
        function last_dayofweek($day)
        {
            // return timestamp of last Monday...Friday
            // will return today if today is the requested weekday
            $day = strtolower(substr($day, 0, 3));
            if (strtolower(date('D')) == $day)
                return strtotime("today");
            else
                return strtotime("last {$day}");
        }
        

        【讨论】:

          【解决方案7】:
          <?php 
              $currentDay = date('D');
              echo "Today-".$today = date("Y-m-d");
              echo "Yesterday-".$yesterday = date("Y-m-d",strtotime('yesterday'));
              echo "Same day last week-".$same_day_last_week = date("Y-m-d",strtotime('last '.$currentDay));
          ?>
          

          【讨论】:

            【解决方案8】:

            不要使用手动计算,而是使用 DateTime 对象。它有适当的实施,考虑到闰年、耶普秒等。

            $today = new \DateTime();
            $today->modify('tuesday last week');
            

            modify 方法修改相对于它的状态的日期,所以如果你将日期设置为不同的日期,它会相对于它计算它。

            $date = new \DateTime('2020-01-01');
            echo $date->format('Y-m-d'); // 2020-01-01
            
            $date->modify('tuesday last week');
            echo $date->format('Y-m-d'); // 2019-12-24
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2022-01-05
              • 2015-03-29
              相关资源
              最近更新 更多