2014-01-08 4 views
0

У меня простая проблема с mktime. Я найти следующий код:PHP mktime иногда возвращает неправильный день

echo date("Y-M-d", mktime(11, 45, 0, 01, 05, 2014)); echo ", "; 
echo date("Y-M-d", mktime(11, 45, 0, 01, 06, 2014)); echo ", "; 
echo date("Y-M-d", mktime(11, 45, 0, 01, 07, 2014)); echo ", "; 
echo date("Y-M-d", mktime(11, 45, 0, 01, 08, 2014)); echo ", "; 
echo date("Y-M-d", mktime(11, 45, 0, 01, 09, 2014)); echo ", "; 

производит следующий вывод:

2014-Jan-05, 2014-Jan-06, 2014-Jan-07, 2013-Dec-31, 2013-Dec-31 

Функция даты только там, чтобы сделать его более удобным для чтения; временные метки, возвращенные самим mktime, ошибочны. Только вещь меняется день месяца, поэтому я не знаю, почему произошел разрыв между 7 и 8 днями, или почему оба 8 и 9 возвращаются в тот же день.

Я проверил, что час, минута и секунда не изменяют результат неправильного дня, хотя они меняют точную метку времени. То есть, последние две строки выше возвращают ту же самую временную метку (1388508300), но если я изменю час, относительное изменение временной метки будет таким, как ожидалось.

В случае, если это имеет значение, это выполняется в PHP 5.3 в рамках установки WordPress.

ответ

8

Целые литералы начиная с 0.. в восьмеричной нотации. 08 в восьмеричном или выше не существует, вы получаете совершенно неправильные значения. Значение для пятого дня - 5, а не 05 и так далее.

5

Избавьтесь от ведущих нулей перед вашими дней (и месяцев)

echo date("Y-M-d", mktime(11, 45, 0, 1, 5, 2014)); echo ", "; 
echo date("Y-M-d", mktime(11, 45, 0, 1, 6, 2014)); echo ", "; 
echo date("Y-M-d", mktime(11, 45, 0, 1, 7, 2014)); echo ", "; 
echo date("Y-M-d", mktime(11, 45, 0, 1, 8, 2014)); echo ", "; 
echo date("Y-M-d", mktime(11, 45, 0, 1, 9, 2014)); echo ", "; 

See it in action

+2

И месяцы. Когда вы доберетесь до 08 и 09, у вас тоже будут большие проблемы. – Jessica

+0

Thanks; конечно, как только я ударил «задаю вопрос», эта возможность возникла и у меня. Я не знал, что начальный ноль (общий для дат форматирования!) В PHP интерпретируется как восьмеричное число. Чтобы быть полностью верным, я должен удалить начальный ноль с «01» (январь), иначе в противном случае у меня возникнет еще одна проблема августа. – GJP

+0

@GJP '08' - это не дата, это просто номер ... :) – deceze

Смежные вопросы