Как получить первый день заданной недели в PHP (многоплатформенный)?

Каков самый простой способ сделать это в 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 ; ?> 

идея состоит в том, чтобы добавить:

  • отметка времени первого января выбранного года
  • количество секунд до конца первой недели (что составляет 7 дней минус день недели 1 января + 1 день), умноженное на количество секунд в день
  • количество секунд для выбранных недель минус первая неделя и текущая неделя
  • 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

Надеюсь это поможет.