Почему 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