使用php查找周数日期


Find week number dates with php

有没有一个解决方案可以找到特定周数的开始和结束日期。示例:

如果我输入$week=5,我想得到2016-03-28-2016-04-03。我只需要一年。

我想你要找的是strtotime和date。

<?php
$year = 2016;
$week = 1;
$a = strtotime('January 1 ' . $year);
$b = date('N', $a) - 1;
$c = $a;
$a += (7 - $b) * 86400;
if($week > 1) {
    $start = $a + (($week - 2) * 604800);
    $end = $start + ($b ? 518400 : 604800);
}
else {
    $start = $c;
    $end = $a - 86400;
}
echo date('l jS 'of F Y', $start);
echo '<br />';
echo date('l jS 'of F Y', $end);

2016年1月1日星期五
2016年1月3日星期日


作为一个经过验证的函数。如果最后一周进入下一年,这个版本甚至会缩短一年的最后一周,就像第一周一样。如果周不在年内,则返回false:

<?php
function weekdays($week, $year = false) {
    $week = floor($week);
    if($week < 0 || $week > 53)
        return false;
    if($year == false)
        $year = date('Y');
    $a = strtotime('January 1 ' . $year);
    $b = date('N', $a) - 1;
    $c = $a;
    $a += (7 - $b) * 86400;
    if($week > 1) {
        $a += (($week - 2) * 604800);
        $b = $a + ($b ? 518400 : 604800);
        return
            date('Y', $a) == $year
                ? array(
                    'first' => $a,
                    'last' =>
                        date('Y', $b) > $year
                        ? $b - (8 - date('N', $b)) * 86400
                        : $b
                ) : false;
    }
    else
        return array('first' => $c, 'last' => $a - 86400);
}
$week = weekdays(14, 2016);
echo date('l jS 'of F Y', $week['first']);
echo '<br />';
echo date('l jS 'of F Y', $week['last']);

2016年3月28日星期一
2016年4月3日星期日

您可以使用DateTime:执行此操作

$year = 2016;
$week = 13;
$date = new DateTime();
$date->setISODate($year, $week);
$start = $date->format('Y-m-d');
$end = $date->modify('+6 days')->format('Y-m-d');
echo 'Week start: '. $start , "'n"; // 2016-03-28
echo 'Week end: '. $end , "'n"; // 2016-04-03

您可以使用PHP相对日期时间函数(http://php.net/manual/en/datetime.formats.relative.php)类似:

//date_default_timezone_set('Europe/Amsterdam');
$date = new DateTime();
$date->modify('2016W5'); //First day of week 5 of 2016
$date->modify('2016W5 +6 days'); //Last day of week 5 of 2016

或者建立自己的功能:

function week_start_date($wk_num, $yr, $first = 1, $format = 'F d, Y') 
{ 
    $wk_ts  = strtotime('+' . $wk_num . ' weeks', strtotime($yr . '0101')); 
    $mon_ts = strtotime('-' . date('w', $wk_ts) + $first . ' days', $wk_ts); 
    return date($format, $mon_ts); 
} 
$sStartDate = week_start_date($week_number, $year); 
$sEndDate   = date('F d, Y', strtotime('+6 days', strtotime($sStartDate))); 

从这里提取:通过php 查找一周中的第一天

如果我输入$week=5,我想得到2016-03-28-2016-04-03。

所以,我想你想要三月五周的星期一和星期日。

为了获得这一点,我创建了一个简单的函数,该函数需要一个日期字符串(YYYY-MM-DD)和周数。函数根据给定的字符串创建一个DateTime对象,然后在月的第一天对其进行修改,然后检索日期周的第一天并添加$week-1周。此时,我们迎来了本周的第一天(星期一)。我们将此日期克隆到$end,并添加6天。

函数返回一个以$start$end日期为属性的对象,该对象是通过投射compact():创建的数组获得的

function monthWeek( $date, $week )
{
    $start = new DateTime( $date );
    $start->modify( 'first day of this month' );
    $start->modify( '-'.($start->format( 'w' )-1).' days' );
    $start->modify( '+'.($week-1).' weeks' );
    $end = clone $start;
    $end->modify( '+6 days' );
    return (object) compact( 'start', 'end' );
}

用一个随意的三月天调用上述函数:

$week = monthWeek( '2016-03-25', 5 );
echo $week->start->format( 'l, Y-m-d' );
echo " => ";
echo $week->end->format( 'l, Y-m-d' );

我们得到这个:

Monday, 2016-03-28 => Sunday, 2016-04-03

您也可以使用该函数来检索基于年份的周,使用一月的一天作为第一个参数:

$week = monthWeek( '2016-01-25', 14 );
echo $week->start->format( 'l, Y-m-d' );
echo " => ";
echo $week->end->format( 'l, Y-m-d' );

将输出:

Monday, 2016-03-28 => Sunday, 2016-04-03

phpFiddle演示