У меня проблема с функциями DateTime php. Сегодня понедельник 3 декабря.
Предполагая следующий код:
$dte = new DateTime(date('Ymd H:i:s')); var_dump($dte->format('Y-W')); $dte->modify('+4 weeks'); var_dump($dte->format('Ymd H:i:s -- Y_W')); $dte->modify('+1 days'); var_dump($dte->format('Ymd H:i:s -- Y_W'));
Через четыре недели это будет 31 декабря. Я бы заподозрил получить последнюю неделю года (52?). Но я получаю неделю 1 2012 года, как вы можете видеть в следующем выпуске.
string '2012-49' (length=7) string '2012-12-31 14:48:00 -- 2012_01' (length=30) string '2013-01-01 14:48:00 -- 2013_01' (length=30)
Поэтому моя проблема в том, что после первой модификации, я думаю, мне нужно:
2012-12-31 14:48:00 -- 2012_52
но вместо этого я получаю
2012-12-31 14:48:00 -- 2012_01
Итак, почему неделя возвращается к 01 без увеличения года, и почему другая линия дает мне 2013_01?
EDIT :: Теперь я вижу, что за неделю до этого неделя 52, что-нибудь связанное с високосным годом? Но опять же, как может неделя вернуться к 01 без увеличения года?
Итак, почему неделя возвращается к 01 без увеличения года, и почему другая линия дает мне 2013_01?
Я думаю, что вы показываете «год» вместо «недельного года». Когда вы используете номера недель, именно эта неделя – это соответствующая часть; простой «год» имеет значение только в отношении месяца и дня.
EDIT: Я думаю, вам нужен спецификатор формата o
, поэтому попробуйте:
var_dump($dte->format('Ymd H:i:s -- o_W'));
Это должно показать вам 2013_01
на 31 декабря 2012 года, как и на неделе 1 недели-2013.
В принципе, я не думаю, что это ошибка в DateTime
– это просто непонимание того, как предполагается использовать «неделю года».
Кажется, это не ошибка. Согласно документации W
вернет ISO-8601 недельный номер года, недели, начиная с понедельника (добавлен в PHP 4.1.0), а так как Mon, 31 Dec 2012 15:04:46 +0100
в понедельник будет 1
вместо 52
,
Дополнительная информация о Википедии и этом хорошем сайте .