У меня есть две части информации, извлеченные из базы данных MySQL, года (2009, 2010, ect) и недели (1-52). И мне нужно преобразовать его в начало даты и дату.
Например:
Year=2010, Week=1 would be (Friday, Jan 1st, 2010) - (Sunday, Jan 3rd, 2010) Year=2010, Week=33 would be (Monday, Aug 16th, 2010) - (Sunday, Aug 22nd, 2010) Year=2010, Week=34 would be (Monday, Aug 23rd, 2010) - (Sunday, Aug 29th, 2010)
Как я буду делать это в php?
$year = "2010"; // Year 2010 $week = "01"; // Week 1 $date1 = date( "l, M jS, Y", strtotime($year."W".$week."1") ); // First day of week $date2 = date( "l, M jS, Y", strtotime($year."W".$week."7") ); // Last day of week echo $date1 . " - " . $date2;
Если номер недели меньше 10, добавьте 0 перед номером. 1 не будет работать, это должно быть 01.
Поскольку этот вопрос и принятый ответ были опубликованы, классы DateTime делают это намного проще:
function daysInWeek($weekNum) { $result = array(); $datetime = new DateTime(); $datetime->setISODate((int)$datetime->format('o'), $weekNum, 1); $interval = new DateInterval('P1D'); $week = new DatePeriod($datetime, $interval, 6); foreach($week as $day){ $result[] = $day->format('d/m/Y'); } return $result; } var_dump(daysInWeek(24));
Вывод:-
array (size=7) 0 => string '10/06/2013' (length=10) 1 => string '11/06/2013' (length=10) 2 => string '12/06/2013' (length=10) 3 => string '13/06/2013' (length=10) 4 => string '14/06/2013' (length=10) 5 => string '15/06/2013' (length=10) 6 => string '16/06/2013' (length=10)
У этого есть дополнительное преимущество, заботясь о високосных годах и т. Д.
function getStartAndEndDate($week, $year) { //setting the default time zone date_default_timezone_set('America/New_York'); //getting the //$firstWeek = date('W',strtotime("January 1 $year", date(time()))); //echo "Year : ".$year."<br/>"."Week : ".$week."<br/>"; $firstWeekThursDay = date('W',strtotime("January $year first thursday",date(time()))); if($firstWeekThursDay == "01") { $time = strtotime("January $year first thursday",date(time())); //echo $time."<br/>"; //echo date('Ymd H:i:s',$time)."<br/>"; $time = ($time-(4*24*3600))+(((7*$week)-6)*24*3600); //echo $time."<br/>"; //echo date('Ymd H:i:s',$time)."<br/>"; $return[0] = date('Ym-d', $time); $time += 6*24*3600; $return[1] = date('Ym-d', $time); //print_r($return); } else { $time = strtotime("January 1 $year", time()); //echo "<br/>".$time."<br/>"; //echo date('Ymd H:i:s',$time)."<br/>"; $time = ($time-(4*24*3600))+(((7*$week)-6)*24*3600); //echo $time."<br/>"; //echo date('Ymd H:i:s',$time)."<br/>"; $return[0] = date('Ym-d', $time); $time += 6*24*3600; $return[1] = date('Ym-d', $time); //print_r($return); //echo "<br/>End of Hi<br/>"; } return $return; }
Попробуйте это:
$year = 2000; $week = 1; $start = date("l, M jS, Y", strtotime("01 Jan ".$year." 00:00:00 GMT + ".$week." weeks")); $end = date("l, M jS, Y", strtotime($start." + 1 week")); echo $start." to ".$end;
Вам нужно установить $ year и $ week. Затем он распечатает интервал, как указано.
Например, выход as-is равен:
Friday, Jan 7th, 2000 to Friday, Jan 14th, 2000
Обратите внимание, что недели индексируются с 0-51 (легко исправить).
Это отвратительно, но это работает. Надеюсь, это поможет!