在 PHP 中获取给定一周的开始和结束天数

2022-08-30 13:29:20

我试图使用星期日作为开始日期和参考日期来获取周范围,例如,但我似乎无法弄清楚。$date

例如,如果我$date为2009-05-01,我会得到2009-04-26和2009-05-02。2009-05-10 将产生 2009-05-10 和 2009-05-16.我当前的代码看起来像这样(我不记得我从哪里抬起它,因为我忘了在评论中放下url):

function x_week_range(&$start_date, &$end_date, $date)
{
    $start_date = '';
    $end_date = '';
    $week = date('W', strtotime($date));
    $week = $week;

    $start_date = $date;

    $i = 0;
    while(date('W', strtotime("-$i day")) >= $week) {
        $start_date = date('Y-m-d', strtotime("-$i day"));
        $i++;
    }

    list($yr, $mo, $da) = explode('-', $start_date);

    $end_date = date('Y-m-d', mktime(0, 0, 0, $mo, $da + 6, $yr));
}

我意识到它所做的只是在当前日期上增加了7天。你会怎么做?


答案 1

我会从PHP的strtotime令人敬畏中得到优势:

function x_week_range(&$start_date, &$end_date, $date) {
    $ts = strtotime($date);
    $start = (date('w', $ts) == 0) ? $ts : strtotime('last sunday', $ts);
    $start_date = date('Y-m-d', $start);
    $end_date = date('Y-m-d', strtotime('next saturday', $start));
}

根据您提供的数据进行测试,它的工作原理。不过,我并不是特别喜欢你正在进行的整个参考事情。如果这是我的函数,我会让它像这样:

function x_week_range($date) {
    $ts = strtotime($date);
    $start = (date('w', $ts) == 0) ? $ts : strtotime('last sunday', $ts);
    return array(date('Y-m-d', $start),
                 date('Y-m-d', strtotime('next saturday', $start)));
}

并这样称呼它:

list($start_date, $end_date) = x_week_range('2009-05-10');

我不是为这样的事情做数学的忠实粉丝。日期很棘手,我更喜欢让PHP弄清楚。


答案 2

对于仍在使用mktime(),strtotime()和其他PHP函数的每个人...试试 PHP5 日期时间类。起初我很犹豫,但它真的很容易使用。不要忘记使用 clone() 来复制你的对象。

编辑:此代码最近进行了编辑,以处理当前日期为星期日的情况。在这种情况下,我们必须获取上个星期六,然后添加一天来获得星期日。

$dt_min = new DateTime("last saturday"); // Edit
$dt_min->modify('+1 day'); // Edit
$dt_max = clone($dt_min);
$dt_max->modify('+6 days');

然后根据需要进行格式化。

echo 'This Week ('.$dt_min->format('m/d/Y').'-'.$dt_max->format('m/d/Y').')';

请务必在代码的早期设置时区。

date_default_timezone_set('America/New_York');

推荐