【问题标题】:PHP - Date function - finding the previous weekPHP - 日期函数 - 查找前一周
【发布时间】:2010-03-02 06:12:43
【问题描述】:

在我的申请中,一周的定义是从周一上午 12:00:00 到周日晚上 11:59:59

每当用户访问我的网站时,我都需要找到前几周的日期范围,并据此向他展示结果。听起来很简单,但我迷路了。

给你一些场景 - - 3 月 1 日星期一上午 12:00:00 到 3 月 7 日星期日下午 12:59:59 是这一周。

现在,当用户在 3 月 8 日、3 月 10 日或 3 月 12 日访问该网站时 - 基于当前日期,我应该能够获得前一周的日期范围,即 3 月 1 日的开始日期和 3 月 7 日的结束日期。

但如果用户在 3 月 16 日访问该网站 - 我需要的日期范围是 3 月 8 日到 3 月 15 日。

我怎样才能在 PHP 中做到这一点。 谢谢

【问题讨论】:

    标签: php date


    【解决方案1】:

    您可以尝试使用时间戳,但时区更改会变得混乱(例如,CET -> CEST)。我会使用DateTime 类:

    $d = new DateTime();
    $weekday = $d->format('w');
    $diff = 7 + ($weekday == 0 ? 6 : $weekday - 1); // Monday=0, Sunday=6
    $d->modify("-$diff day");
    echo $d->format('Y-m-d') . ' - ';
    $d->modify('+6 day');
    echo $d->format('Y-m-d');
    

    【讨论】:

    • 为了整理白班,您可以使用(6+$weekday)%7 而不是($weekday == 0 ? 6 : $weekday - 1)
    【解决方案2】:

    strtotime 函数在这里非常方便:

    $mondayStr = "last monday";
    if (date('N') !== '1') {  // it's not Monday today
        $mondayStr .= " last week";
    }
    
    $monday = strtotime($mondayStr);
    echo date('r', $monday);    // Mon, 22 Feb 2010 00:00:00 +1000
    
    $sunday = strtotime('next monday', $monday) - 1;
    echo date('r', $sunday);    // Sun, 28 Feb 2010 23:59:59 +1000
    

    【讨论】:

    • 感谢 nick - 我以前没有听说过这个功能。欣赏它
    • @Gublooo,之前的代码有一个小错误:它将得到 this 周,除非今天是星期一。现在已经解决了。
    • 这正是我在回答中所说的“使用时间戳尝试”的那种代码。如果你生活在错误的国家并在错误的日子运行,你会得到惊喜,因为第二个结果不是周日的 23:59:59,而是周一的 00:59:59。耶,夏令时。如果您必须使用时间戳,至少要确保您使用的是 GMT。
    • @Lukáš - 我现在更改了代码,以便它能够适应 DST 更改。此外,时间戳只是一个数字 - 自格林威治标准时间 1970 年 1 月 1 日午夜以来的秒数。因此,他们自己没有时区。
    • 它们没有时区,但是当您使用 date() 将其转换为日期/时间时,它们会绑定到时区。不同的时区会给你带来不同的转化。
    【解决方案3】:
    function get_week_start($year, $month, $day)
    {
        $timestamp = mktime(0, 0, 0, $month, $day, $year);
        return date('F j Y', $timestamp = mktime(0, 0, 0, $month, date('d', $timestamp)-date('w', $timestamp), $year));
    }
    

    您也许可以添加接下来的 6 天,然后就可以了。

    【讨论】:

    • 谢谢索普让我看看
    【解决方案4】:

    PHP Documentation 中有一个用户函数。

    【讨论】:

      【解决方案5】:

      格林威治标准时间版本

      $prev_monday_t = time() - (gmdate('N') + 6) * 86400;
      $prev_sunday_t = time() - gmdate('N') * 86400;
      
      echo gmdate('Y-m-d H:i:s', $prev_monday_t ).' '.gmdate('Y-m-d H:i:s', $prev_sunday_t );
      

      本地版本

      $prev_monday_t = time() - (date('N') + 6) * 86400;
      $prev_sunday_t = time() - date('N') * 86400;
      
      echo date('Y-m-d H:i:s', $prev_monday_t ).' '.date('Y-m-d H:i:s', $prev_sunday_t );
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-04
        • 1970-01-01
        • 2015-10-14
        • 2012-01-24
        • 2013-10-31
        相关资源
        最近更新 更多