Как преобразовать номер недели и год в метку времени unix?

Я пытаюсь сгруппировать даты в номер недели и год, а затем хочу преобразовать этот номер недели обратно в метку времени unix. Как я могу это сделать?


person blacktie24    schedule 23.04.2011    source источник
comment
Пожалуйста, поясните, что вы имеете в виду под преобразованием номера недели в метку времени.   -  person Pekka    schedule 23.04.2011


Ответы (3)


Я предполагаю, что вы используете номера недель ISO 8601 и хотите, чтобы первый день недели ISO 8601, например, Week 1 of 2011 возвращает January 3 2011.

strtotime может сделать это прямо из коробки, используя формат {YYYY}W{WW}:

echo date("Y-m-d", strtotime("2011W01")); // 2011-01-03

Обратите внимание, что номер недели должен состоять из двух цифр.

К сожалению, DateTime::createFromFormat, новый модный способ работы с датами в PHP 5, похоже, не может анализировать такую ​​информацию - у него нет заполнителя "неделя".

person Pekka    schedule 23.04.2011
comment
Хотя примечание о DateTime::createFromFormat() по-прежнему актуально сегодня, к сожалению, я хочу добавить, что вы все еще можете использовать для этого DateTime: new DateTime('2011W01') действительно работает. - person Dennis98; 03.05.2019
comment
Пока это работает ... вы знаете, где для этого есть официальная документация? strtotime (php.net/manual/en/function.strtotime.php) указывает на DateFormats (php.net/manual/en/datetime .formats.date.php), в котором этот формат не упоминается. Хотя я вижу дату (php.net/manual/en/function.date.php) делает. - person Anthony; 07.01.2020

  • $week: номер недели
  • $year: номер года

Потом:

$timestamp = gmmktime (0, 0 , 0 , 1, , 4 + 7*($week - 1), $year);

4 + 7*($week - 1) возникает из-за того, что согласно ISO 8601 первая неделя года является который содержит 4 января.

person Oswald    schedule 23.04.2011
comment
Я не думаю, что это надежно: 1/1/2011 был все еще на неделе 52/2010 в соответствии с ISO 8601. - person Pekka; 23.04.2011
comment
@Pekka Это имеет значение только в том случае, если преобразование должно быть тривиальным обратимым. Тем не менее поменял. - person Oswald; 23.04.2011
comment
Это возвращает 4 января 2008 г. для недели 1 2008 г., но, согласно ISO, эта неделя начинается 31 декабря 2007 г. - person Pekka; 23.04.2011
comment
Я бы не рекомендовал это решение. Есть несколько мест, где я бы предложил использовать mktime() или gmmktime() вместо strtotime() - person James C; 23.04.2011
comment
@Pekka Неделя - это промежуток времени, поэтому он по определению не может быть преобразован в метку времени (то есть в отдельный момент времени). Единственное, что можно сделать, - это взять метку времени, которая представляет эту неделю. Этот представитель не обязательно должен быть началом недели (если иное не указано в требованиях). - person Oswald; 23.04.2011
comment
@ Освальд, ну да ладно. ОП действительно нужно прояснить, чего они хотят. - person Pekka; 23.04.2011

strtotime('1/1/2011 + 4 weeks') (1/1 всегда на неделе номер один; это приведет меня к неделе номер пять). если вы хотите любую метку времени на неделе, то это все, что вам нужно, иначе вам придется пойти в понедельник на этой неделе:

$t = strtotime('1/1/2011 + 4 weeks');
$t -=  24 * 60 * 60 * date('w', $t);

Обновление: вместо 1/1/2011 используйте первый понедельник 2011 года. Второй расчет больше не нужен.

person Florian    schedule 23.04.2011
comment
Я не думаю, что это надежно: 1/1/2011 был все еще на неделе 52/2010 в соответствии с ISO 8601. - person Pekka; 23.04.2011
comment
Первая неделя 2008 г. была 31 декабря 2007 г. Это не сработает в этом сценарии. - person Pekka; 23.04.2011