Почему mktime() не работает с двойными цифрами, когда достаточно одной цифры?

Я довольно новичок в PHP, так что простите, если это глупый вопрос.

Я попытался запустить mktime() на моем сайте и, поскольку я все еще знаком с синтаксисом, запустил что-то вроде этого:

дата эха ('h:i:s Md-Y', mktime(12, 00, 00, 12, 08, 2013));

То, что я был удивлен, обнаружил, что это возвращено

12:00:00 ноябрь-30-2013

Когда то, что я ожидал, было так:

12:00:00 дек-08-2013

В конце концов я понял, что проблема в "08", и это просто "8".

Учитывая, что mktime() способен вносить некоторые оперативные исправления и допущения (например, пример № 2), почему он просто не исправляет "08" в "8"? Это особенно смущает меня, так как он отлично справляется с двойными нулями. Это особенность, ошибка или просто особенность языка?

Кроме того, почему это "правильно" до 30 ноября, в отличие от какой-то другой даты? Учитывая приведенные выше примеры, я бы ожидал 01 января.

3 ответа

Решение

Это не проблема с mktime, но с тем, как PHP интерпретирует буквальные числа.

В PHP, когда буквенное число начинается с нуля, например 01 или же 08 оно интерпретируется как восьмеричное, см. http://www.php.net/manual/en/language.types.integer.php аналогичное тому, как 0x префикс обозначает шестнадцатеричные литеральные числа.

Обратите внимание, что 08 на самом деле является недействительным, так как восьмеричные числа имеют цифры 0-7, в документации PHP говорится, что "Если недопустимая цифра задана в восьмеричном целом числе (то есть 8 или 9), остальная часть числа игнорируется", поэтому 08 становится 0следовательно, почему это происходит до 30 ноября.

Номера, начинающиеся с ведущих 0 лайк 08 восьмеричные обозначения; Кроме 08 неверно восьмеричное значение, поэтому оно рассматривается как значение 0.

Поскольку в 12-м месяце нет 0-го дня, 1-й день 1-го декабря дает последний день предыдущего месяца, 30-го ноября.

Числа с начальным нулем преобразуются в восьмеричные числа (база 8): http://www.php.net/manual/en/language.types.integer.php

Другие вопросы по тегам