【问题标题】:Get Last Monday - Sunday's dates: Is there a better way?获取上周一 - 周日的日期:有更好的方法吗?
【发布时间】:2011-01-25 15:16:16
【问题描述】:

我正在为 mySQL 准备一个查询以获取前一周的记录,但我必须将几周视为星期一 - 星期日。我最初是这样做的:

WHERE YEARWEEK(contactDate) = YEARWEEK(DATE_SUB(CURDATE(),INTERVAL 7 DAY))

发现 mySQL 将星期视为星期日 - 星期一。因此,我正在解析获取 php 中的开始和结束日期,如下所示:

$i = 0; 
while(date('D',mktime(0,0,0,date('m'), date('d')-$i, date('y'))) != "Mon") { 
  $i++; 
}

$start_date = date('Y-n-j', mktime(0,0,0,date('m'), date('d')-($i+7), date('y')));
$end_date  = date('Y-n-j', mktime(0,0,0,date('m'), date('d')-($i+1), date('y')));

这行得通 - 它获取当前一周的星期一日期(向后走直到星期一),然后根据该日期计算前一周的日期。

我的问题是:有没有更好的方法来做到这一点?只是看起来很草率,我希望有人可以给我一个更干净的方法来做这件事 - 或者可能不是因为我需要周一到周日的周。

编辑

显然有:

$start = date('Y-m-d',strtotime('last monday -7 days'));
$end   = date('Y-m-d',strtotime('last monday -1 days'));

这大约是可读性的一百万倍。谢谢。

【问题讨论】:

    标签: php mysql datetime


    【解决方案1】:

    您可以使用strtotime 处理此类日期问题

    echo strtotime("last Monday");
    

    【讨论】:

    • 优雅!我忘了这件事。
    • echo date('Y-m-d',strtotime('last monday -7 days')); 令人难以置信。
    • 令人难以置信的是对的!惊人的! strftime('%Y-%m-%d', strtotime("上周星期一")) 或者试试: strftime('%Y-%m-%d', strtotime("上个月的第一天"));
    • @marvin 你是等到今天才测试它吗? ;-)
    • 它应该是“上周一”,上周一将返回本周周一。
    【解决方案2】:

    (对 marvin 和 Stomped 的补充)你也可以这样使用它

    echo date('Y-m-d',strtotime('-1 Monday')); //last Monday
    echo date('Y-m-d',strtotime('-2 Monday')); //two Mondays ago
    echo date('Y-m-d',strtotime('+1 Monday')); //next Monday
    

    【讨论】:

      【解决方案3】:
      strtotime("previous week Monday")
      

      前一周的星期一。

      【讨论】:

      • 正是我一直在寻找的...#awesome
      • 这是更正确的答案,而不是“-1 Monday”和“Last Monday”,它们返回本周的星期一
      【解决方案4】:

      Marvin 的回答非常优雅,尽管如果您真的想追求性能,您可以通过一点算术来做到这一点。您可以推导出一个公式/方法来将任意日期转换为“从某个起点开始的天数”(可能是 01.01.0000),然后其余的操作就很容易了。从这样的数字中获取星期几就像减去并得到除法的余数一样简单。

      实际上,PHP 在其 PEAR 库中有一个 Date 类,正是这样做的。

      【讨论】:

        【解决方案5】:

        我必须在这里向所有读者指出,马文的回答有一个大问题

        这是关键 "last Monday" 函数会返回 "latest" Monday 的日期。这样解释,如果今天是星期一,则返回 "LAST WEEK" 星期一的日期,但如果今天不是星期一,则返回“本周”星期一 问题是要求周一返回“上周”。因此,如果今天不是星期一,结果将不正确。 我已经解决了这个问题并包含在我的日期时间助手中 在您“包含”课程后,它将只有一行

        $lastWeekMonday = Model_DTHpr::getLastWeekMonday();

        检查这里

        https://github.com/normandqq/Date-Time-Helper

        【讨论】:

        • 我也发现了。但是,就我而言,即使我在周二运行它,我也想确保我在上周一确实得到了它。我发现你可以这样做:strftime('%Y-%m-%d', strtotime("last week Monday"))
        猜你喜欢
        • 1970-01-01
        • 2021-12-31
        • 2015-03-10
        • 2017-09-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-06-29
        • 2019-03-31
        相关资源
        最近更新 更多