Год и неделя на php
У меня есть две части информации, извлеченные из базы данных 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?
Ответы
Ответ 1
$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.
Ответ 2
Поскольку этот вопрос и принятый ответ были опубликованы, классы 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)
Это имеет дополнительное преимущество - заботиться о високосных годах и т.д.
Ответ 3
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('Y-m-d H:i:s',$time)."<br/>";
$time = ($time-(4*24*3600))+(((7*$week)-6)*24*3600);
//echo $time."<br/>";
//echo date('Y-m-d H:i:s',$time)."<br/>";
$return[0] = date('Y-m-d', $time);
$time += 6*24*3600;
$return[1] = date('Y-m-d', $time);
//print_r($return);
}
else
{
$time = strtotime("January 1 $year", time());
//echo "<br/>".$time."<br/>";
//echo date('Y-m-d H:i:s',$time)."<br/>";
$time = ($time-(4*24*3600))+(((7*$week)-6)*24*3600);
//echo $time."<br/>";
//echo date('Y-m-d H:i:s',$time)."<br/>";
$return[0] = date('Y-m-d', $time);
$time += 6*24*3600;
$return[1] = date('Y-m-d', $time);
//print_r($return);
//echo "<br/>End of Hi<br/>";
}
return $return;
}
Ответ 4
Попробуйте следующее:
$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 (легко исправить).
Это вроде уродливо, но это работает. Надеюсь, что это поможет!