查找两个周数之间所有周的起始日期和结束日期

5
我尝试获取两个周数之间所有周的开始日期和结束日期。
我的其中一个日期是2014-05-17,它的周数为20。另一个日期是2014-08-13,它的周数是33。 我的任务是获取20到33之间所有周的开始日期和结束日期。这里的周起始日是星期日,结束日是星期六。
$signupweek='2014-05-17';
$signupweek=date("W",strtotime($signupdate));

//week number of current date.
$weekNumber = date("W");

有人能帮忙找到日期吗?


好像是对那些优秀的程序员来说一个挑战。 - kimbarcelona
可能是PHP按周数获取一周的开始和结束日期的重复问题。 - scrowler
5个回答

12

试一下这个

$signupdate='2014-05-17';
$signupweek=date("W",strtotime($signupdate));
$year=date("Y",strtotime($signupdate));
$currentweek = date("W");

for($i=$signupweek;$i<=$currentweek;$i++) {
    $result=getWeek($i,$year);
    echo "Week:".$i." Start date:".$result['start']." End date:".$result['end']."<br>";
}

function getWeek($week, $year) {
  $dto = new DateTime();
  $result['start'] = $dto->setISODate($year, $week, 0)->format('Y-m-d');
  $result['end'] = $dto->setISODate($year, $week, 6)->format('Y-m-d');
  return $result;
}

输出

Week:20 Start date:2014-05-11 End date:2014-05-17
Week:21 Start date:2014-05-18 End date:2014-05-24
Week:22 Start date:2014-05-25 End date:2014-05-31
Week:23 Start date:2014-06-01 End date:2014-06-07
Week:24 Start date:2014-06-08 End date:2014-06-14
Week:25 Start date:2014-06-15 End date:2014-06-21
Week:26 Start date:2014-06-22 End date:2014-06-28
Week:27 Start date:2014-06-29 End date:2014-07-05
Week:28 Start date:2014-07-06 End date:2014-07-12
Week:29 Start date:2014-07-13 End date:2014-07-19
Week:30 Start date:2014-07-20 End date:2014-07-26
Week:31 Start date:2014-07-27 End date:2014-08-02
Week:32 Start date:2014-08-03 End date:2014-08-09
Week:33 Start date:2014-08-10 End date:2014-08-16

3

另一种方法是...

如果你有一个日期,你可以从那个日期找到该开始日期结束日期,但这里不使用周数

例如:

你有一个日期 2014-08-13,那么所需的开始日期2014-08-10结束日期2014-08-16

PHP代码如下:

   $signupweek='2014-8-13';
/*start day*/
    for($i = 0; $i <7 ; $i++)
    {
     $date = date('Y-m-d', strtotime("-".$i."days", strtotime($signupweek)));
     $dayName = date('D', strtotime($date));
     if($dayName == "Sun")
     {
       echo "start day is ". $date."<br>";
     }
    }
/*end day*/
 for($i = 0; $i <7 ; $i++)
    {
     $date = date('Y-m-d', strtotime("+".$i."days", strtotime($signupweek)));
     $dayName = date('D', strtotime($date));
     if($dayName == "Sat")
     {
       echo "end day is ". $date."<br>";
     }
    }

输出

start day is 2014-08-10
end day is 2014-08-16

希望这对你有用。

0

现在您可以使用DateTime获取一周的开始/结束日期

function getDateRangeForAllWeeks($start, $end){
    $fweek = getDateRangeForWeek($start);
    $lweek = getDateRangeForWeek($end);
    $week_dates = [];
    while($fweek['sunday']!=$lweek['sunday']){
        $week_dates [] = $fweek;
        $date = new DateTime($fweek['sunday']);
        $date->modify('next day');

        $fweek = getDateRangeForWeek($date->format("Y-m-d"));
    }
    $week_dates [] = $lweek;

    return $week_dates;
}

function getDateRangeForWeek($date){
    $dateTime = new DateTime($date);
    $monday = clone $dateTime->modify(('Sunday' == $dateTime->format('l')) ? 'Monday last week' : 'Monday this week');
    $sunday = clone $dateTime->modify('Sunday this week'); 
    return ['monday'=>$monday->format("Y-m-d"), 'sunday'=>$sunday->format("Y-m-d")];
}

print_r( getDateRangeForWeek("2016-05-07") );

print_r( getDateRangeForAllWeeks("2015-11-07", "2016-02-15") );

0

这是一个实现此答案中函数的示例:

$signupweek = '2014-05-17';
$signupweek = date("W", strtotime($signupweek));

$current_week = date('W');

$output = array();
// Loop through the weeks BETWEEN your given weeks
// to include the start and end week, remove the +1 below and make 
// it $i <= $current_week
for($i = $signupweek + 1; $i < $current_week; $i++) {
    // Get the start and end for the current week ($i)
    $dates = getStartAndEndDate($i, '2014');
    // if the start or end of the week is greater than now, skip it
    if(strtotime($dates['start']) > time() or strtotime($dates['end']) > time())
        continue;
    // Add to output array
    $output[] = $dates;
}

function getStartAndEndDate($week, $year)
{

    $time = strtotime("1 January $year", time());
    $day = date('w', $time);
    $time += ((7 * $week) + 1 - $day) * 24 * 3600;
    $return['start'] = date('Y-n-j', $time);
    $time += 6 * 24 * 3600;
    $return['end'] = date('Y-n-j', $time);
    return $return;
}

输出


0

试试这个:

$startTime = "2014-05-17";
$startWeek = 20;
$endWeek = 33;

for ($i = 0; $i <= ($endWeek - $startWeek); $i++) {
    $days = $i * 7;
    echo date("Y-m-d", strtotime($startTime . "+$days day")).'<br />';
}

很遗憾,似乎2014年8月13日不是第33周的开始。2014年8月16日才是。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接