如何根据当前时间来输出向前数1-5周的日期情况?

使用循环,输出2个数组,start数组存开始时间,stop数组存截至时间。
假如今天是3月27日,则start数组是:

Array
(
    [0] => 2017-03-20
    [1] => 2017-03-13
    [2] => 2017-03-06
    [3] => 2017-02-27
)

stop数组是:

Array
(
    [0] => 2017-03-26
    [1] => 2017-03-19
    [2] => 2017-03-12
    [3] => 2017-03-05
)

如下图:
图片描述

请问如何才可以使任意在任意哪一天都可以输出以上结果?从周一开始,周日截至。我写的代码现在只是在星期一的时候生效,但是我改了系统时间为其他天数就不生效了。

阅读 3.2k
4 个回答
$today = date('N'); //今天周几

echo $mon = date('Y-m-d', strtotime("-" . ($today - 1) . "day")); //这周 周一是哪天
echo $sun = date('Y-m-d', strtotime($mon . '+ 6 days')); //这周 周日那一天

$start = [];
$stop = [];
for ($i = 0; $i < 5; $i++) {
    $start[] = $mon = date('Y-m-d', strtotime($mon . '- 7 days'));
    $stop[] = $sun = date('Y-m-d', strtotime($mon . '+ 6 days'));
}
print_r($start);
print_r($stop);
SELECT * FROM test WHERE YEARWEEK(date_format(startdate,'%Y-%m-%d'),1) = YEARWEEK(now(),1)-1

例子是输出上一周,上两周就是最后那个-2其他类推。。。YEARWEEK函数第二个参数给1是从周一开始算一周,默认不给是周日起算。

/**   
 * 获取上n周的开始和结束,每周从周一开始,周日结束日期  
 * @param int $timestamp 时间戳   
 * @param int $n 前多少周
 * @param string $format 默认为'%Y-%m-%d',比如"2017-03-27"
 * @return array 第一个元素为开始日期你的start数组,第二个元素为结束日期你的stop数组 */
function lastNWeek($timestamp, $n, $format = '%Y-%m-%d')
{
    $timestamp = intval($timestamp);
    $n = abs(intval($n));         // 周一到周日分别为1-7
    $dayOfWeek = date('w', $timestamp);
    if (0 == $dayOfWeek) {
        $dayOfWeek = 7;
    }
    $lastNMonday = 7 * $n + $dayOfWeek - 1;
    $lastNSunday = 7 * ($n - 1) + $dayOfWeek;
    return array(
        strftime($format, strtotime("-{$lastNMonday} day", $timestamp)), 
        strftime($format, strtotime("-{$lastNSunday} day", $timestamp)));
}
$today =strtotime(date('Y-m-d'));

        $befor_day = $today-24*3600;
        $start_first = $today -24*3600*7;
        $stop[] = date('Y-m-d',$befor_day);
        $p_day = $befor_day;
        $start[] = date('Y-m-d',$start_first);
        $t_day = $start_first;
        for ($i=0; $i < 3; $i++) { 
            $p_day = $p_day -24*3600*7;
            $stop[] = date('Y-m-d',$p_day);
            $t_day = $t_day -24*3600*7;
            $start[] = date('Y-m-d',$t_day);
        }

        echo "<pre>";
        var_dump($start);
        echo "<pre>";
        var_dump($stop);

我仅仅是抛个砖。

PHP支持很多日期时间的表示方式的,时间处理的相关函数和DateTime相关对象都能很好的支持。

$date = '2017-03-27'; //这里我指定了一个字符串,要当天时间请自行获取
$start = array();
$newdate = $date;

for($i=1; $i<=4; $i++) {
    $newdate = date('Y-m-d', strtotime('previous Monday '.$newdate));
    $start[] = $newdate;
}

上面的方法有两个问题,如果开始的日期是星期一(比如2017-03-27就是),那么'previous Monday'会如字面意思是上一个星期一(2017-03-27的上一个星期一就是2017-03-20),如果不是,那么会是当周的星期一(比如2017-03-28星期二的上一个星期一就是2017-03-27)。

另一个问题就是周日,如果要获取当周的星期日,肯定不能用'previous Sunday'了,比如2017-03-27的当周星期日是4月2日(如果你的日历是以星期一开始星期日结束,如果是星期日开始星期六结束那又要另说了),如果获取上一个星期日就会是2017-03-26了。

所以处理日期的问题其实还是比较复杂的,关于PHP支持的日期时间表示格式可以参见文档Supported Date and Time Formats

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题