在PHP中获取给定周的开始和结束日期

Zah*_*aka 30 php datetime

我试图用星期日作为开始日期和参考日期来获得星期范围,比方说$date,但我似乎无法弄明白.

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

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));
}
Run Code Online (Sandbox Code Playgroud)

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

Pao*_*ino 86

我会利用PHP的strtotime awesomeness:

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));
}
Run Code Online (Sandbox Code Playgroud)

测试您提供的数据,它的工作原理.不过,我并不特别喜欢你所参考的整个参考资料.如果这是我的功能,我会这样:

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)));
}
Run Code Online (Sandbox Code Playgroud)

并称之为:

list($start_date, $end_date) = x_week_range('2009-05-10');
Run Code Online (Sandbox Code Playgroud)

对于像这样的事情我不是很喜欢做数学的人.日期很棘手,我更喜欢让PHP搞清楚.

  • 尝试PHP5 DateTime类! (3认同)
  • 我使用以下内容来格式化最后一个星期日:date('Ym-d',strtotime('last sunday')) (2认同)

jjw*_*ign 21

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

编辑:最近编辑了此代码以处理当天是星期日的情况.在这种情况下,我们必须得到过去的星期六,然后再添加一天来获得星期天.

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

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

echo 'This Week ('.$dt_min->format('m/d/Y').'-'.$dt_max->format('m/d/Y').')';
Run Code Online (Sandbox Code Playgroud)

确保在代码中尽早设置时区.

date_default_timezone_set('America/New_York');
Run Code Online (Sandbox Code Playgroud)

  • 除非我读错了,否则如果今天是星期天,我不确定这个逻辑是否会成功.如果今天是星期天,你制作了`lastTime'的'DateTime`对象,那么PHP将返回上一个星期日,而不是当前的星期日.因此,如果今天的日期是2016年2月28日,上面的代码将回应"本周2/21/2016 - 2016年2月27日"(实际上是前一周.周一到周六会隐藏这个问题.我建议一些事情比如`$ dt_min = new DateTime("上周六+24小时");` (2认同)
  • 好赶上cdmo!我改变了代码来反映. (2认同)

Cra*_*loy 9

显然'w'格式化date()或DateTime对象的格式方法将返回星期几作为数字(默认情况下,0 =星期日,1 =星期一等)

您可以将此值减去并将其值减去当天的天数以查找本周的开头.

$start_date = new DateTime("2009-05-13");
$day_of_week = $start_date->format("w");

$start_date->modify("-$day_of_week day");
Run Code Online (Sandbox Code Playgroud)

$ start_date现在将等于该周的星期日,从那里你可以添加7天来获得本周结束或者你有什么.