2013-05-24 4 views
0

Я пишу программный код для отображения числа недель между двумя датами. Я также хочу показать даты между номером недели. Я написал следующий код в соответствии с кодами примеров из переполнения стека. (here & & here)PHP Weeknumber, дата начала и дата окончания

function getStartAndEndDate($week, $year) 
{ 
$time = strtotime("1 January $year", time()); 
$day = date('w', $time); 
$time += ((7*$week)+1-$day)*24*3600; 
$return[0] = date('dMY', $time); 
$time += 6*24*3600; 
$return[1] = date('dMY', $time); 
return $return; 
} 
$startTime = strtotime('2013-04-01'); 
$endTime = strtotime('2013-05-03'); 

$weeks = array(); 

while ($startTime < $endTime) 
{ 
$weeks[] = date('W', $startTime); 
$startTime += strtotime('+1 week', 0); 
} 
echo count($weeks)."<br/>"; 
$year="2013"; 
foreach ($weeks as $key => $w) 
{ 
echo "Week Number:".$w."--"; 
$return=getStartAndEndDate($w,$year); 
$r0=$return[0]; 
$r1=$return[1]; 
echo "Start-".$r0."-End-".$r1."<br/>"; 
} 

Но выход неправильно. Выходные показывает:

Неделя Количество: 14 - Пуско-07Apr2013-End-13Apr2013

Неделя Количество: 14 - Пуско-07Apr2013-End-13Apr2013

номер недели : 15 - Пуско-14Apr2013-End-20Apr2013

Неделя Количество: 16 - Пуско-21Apr2013-End-27Apr2013

номер недели : 17 - Start-28Apr2013-End-04May2013

14-я неделя начинается с 31Mar2013 до 6Apr2013. Я не мог понять, в чем проблема. Любая помощь должна быть оценена!

+0

Я подозреваю, что это проблема часовых поясов, но я не могу воспроизвести его с любым часовым поясом, я попытался. – Barmar

+0

Да, вероятно, проблема с часовым поясом. Но мне интересно, как я могу написать код! – NewPHP

+0

Вызывает ли 'date_default_timezone_set ('UTC')' исправление? – Barmar

ответ

0

Я понял это:

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); 
} 


$year="2013"; 
$startDate="2012-12-30"; 
$endDate="2013-05-03"; 

$p = new DatePeriod(
     new DateTime($startDate), 
     new DateInterval('P1W'), 
     new DateTime($endDate) 
); 

foreach ($p as $k=>$w) { 
    echo $k.":".$w->format('W')."<br/>"; 
    $w=$w->format('W'); 
    $sStartDate = week_start_date($w, $year); 
    $sEndDate = date('F d, Y', strtotime('+6 days', strtotime($sStartDate))); 
    echo $sStartDate."&&".$sEndDate."<br/>"; 
} 
0

ли вы пытаетесь проверить с датой

$startTime = strtotime('2012-12-30'); 
$endTime = strtotime('2013-05-03'); 

actual14th неделя

Week Number:14--Start-08Apr2013-End-14Apr2013 

не

14th week starts from 31Mar2013 to 6Apr2013 

РНР начала недели с понедельника -> воскресенье. Так что если вы берете 2012-12-30, который воскресенье он будет рассчитывать

Week Number:01--Start-07Jan2013-End-13Jan2013 
Week Number:02--Start-14Jan2013-End-20Jan2013 
Week Number:03--Start-21Jan2013-End-27Jan2013 
Week Number:04--Start-28Jan2013-End-03Feb2013 
Week Number:05--Start-04Feb2013-End-10Feb2013 
Week Number:06--Start-11Feb2013-End-17Feb2013 
Week Number:07--Start-18Feb2013-End-24Feb2013 
Week Number:08--Start-25Feb2013-End-03Mar2013 
Week Number:09--Start-04Mar2013-End-10Mar2013 
Week Number:10--Start-11Mar2013-End-17Mar2013 
Week Number:11--Start-18Mar2013-End-24Mar2013 
Week Number:12--Start-25Mar2013-End-31Mar2013 
Week Number:13--Start-01Apr2013-End-07Apr2013 
Week Number:14--Start-08Apr2013-End-14Apr2013 
+0

О, хорошо, я посмотрю. Но мой код отображает две 14-й недели – NewPHP

Смежные вопросы