Каков самый простой способ сделать это в PHP?
Я хочу, чтобы дата в понедельник данной недели была числом года (пример: неделя № 3 2009 года)
Благодаря !
EDIT: Если вы используете только Linux-машины, используйте решение cletus, однако я ищу что-то, что может работать на Windows и Linux.
Еще одно решение:
<?php $week = 3; $year = 2009; $timestamp = mktime( 0, 0, 0, 1, 1, $year ) + ( $week * 7 * 24 * 60 * 60 ); $timestamp_for_monday = $timestamp - 86400 * ( date( 'N', $timestamp ) - 1 ); $date_for_monday = date( 'Ym-d', $timestamp_for_monday ); ?>
Это просто на PHP 5.3
echo date('M d',strtotime('2013W15'));
где 15 – количество недель. Но для числа ниже десяти убедитесь, что оно находится в формате 01, 02 для первой недели и второй недели.
Хорошим способом получить это в чистом виде является использование класса php DateTime.
$year = 2015; $week_no = 1; $date = new DateTime(); $date->setISODate($year,$week_no); echo $date->format('dM-Y');
-$year = 2015; $week_no = 1; $date = new DateTime(); $date->setISODate($year,$week_no); echo $date->format('dM-Y');
Это приведет к: 29-12-2014
Вы можете использовать strptime()
чтобы получить время.
$time = strptime('1 23 2009', '%w %U %Y');
Это даст время для понедельника (день 1, 0 – воскресенье, 6 – суббота) 23-й недели 2009 года. Если вы хотите отформатировать это в дату, используйте date()
.
$date = date('d F Y', $time);
Кажется, что он работает и не зависит от ОС сервера:
<?php $week = 4; $year = 2013; $timestamp_for_monday = mktime( 0, 0, 0, 1, 1, $year ) + ((7+1-(date( 'N', mktime( 0, 0, 0, 1, 1, $year ) )))*86400) + ($week-2)*7*86400 + 1 ; ?>
идея состоит в том, чтобы добавить:
Мой пример возвращает: 1358722801, который является отметкой времени 2013/01/21 0:00:01
Этот следующий скрипт дает 7 дней определенной недели года
$time = new DateTime(); $time->setISODate(2016, 13); for($i=0;$i<7;$i++){ echo $time->format('dM-Y') . '<br />'; $time->add(new DateInterval('P1D')); }
Здесь очень простое решение, минуя неделю нет и возвращает дату.
В стандарте ISO8601 говорится, что неделя 1 всегда падает на неделю, где падает 4 января.
Например, чтобы получить день на 4-й неделе года:
$day_in_week = strtotime("2006-01-04 + 4 weeks"));
Затем вы можете настроить это значение на воскресенье (в качестве стартового места вы можете гарантировать, что можете найти):
// Find that day's day of the week (value of 0-6) $wday = date('w', $day_in_week); $offset = 6 - $wday; // How far it is from Sunday. $sunday_in_week = $day_in_week - ($offset * (60 * 60 * 24)); // $offset * seconds in a day
Затем вы добавляете секунды в день снова, чтобы получить понедельник.
$monday_in_week = $sunday_in_week + (60 * 60 * 24);
Примечание. Этот метод может иногда иметь некоторые проблемы с летним временем. Аналогичный, и немного более безопасный между изменениями времени DST, метод будет использовать класс DateTime . Тем не менее, DateTime поддерживает только PHP 5.2.0 или новее. Метод выше работает и в более ранней версии.
Попробуйте эту функцию
function MondayOfWeek($WeekNumber, $Year=-1) { if ($Year == -1) $Year = 0+date("Y"); $NewYearDate = mktime(0,0,0,1,1,$Year); $FirstMondayDate = 7 + 1 - date("w", mktime(0,0,0,1,1,2009)); $Dates_fromFirstMonday = 7 * $WeekNumber; $Second_fromFirstMonday = 60*60*24*($FirstMondayDate + $Dates_fromFirstMonday); $MondayDay_ofWeek = $NewYearDate + $Second_fromFirstMonday; $Date_ofMondayDay_ofWeek = 0+date("j", $MondayDay_ofWeek); return $Date_ofMondayDay_ofWeek; } for($i = 0; $i
Когда я бегу, я получил:
-5-12-19-26-2-9-16-23-2-9-16-23-30-6-13-20-27-4-11-18-25-1-8-15-22 -29-6-13-20-27-3-10-17-24-31-7-14-21-28-5-12-19-26-2-9-16-23-30-7-14 -21-28
Надеюсь это поможет.