2012-03-28 2 views
2
$datetime = new DateTime('0000-00-00 00:00:00'); 
$date_string = $datetime->format('Y-m-d H:i:s');//-0001-11-30 00:00:00 

получает повернутую от 0000-00-00 00:00:00 до -0001-11-30 00:00:00 это, очевидно, не так, почему это происходит, как исправить Это? Должен по крайней мере вернуть false.года 0 повреждаются Дата

информация: PHP Version 5.2.13-0.dotdeb.1 Linux 2.6.26-2-amd64-OpenVZ # 1 SMP чт 25 ноября 5:14:47 UTC 2010 x86_64

+0

Во многих календарных системах, особенно юлианских/григорианских, нет «года 0», из которых какой-то вариант используется «форматом». Любопытно, почему он выбирает эту дату, однако ... 30 дней «слишком рано»? –

ответ

1

Это своего рода правильно по определению:

  • нулевой й день в отличие от первых, дает (гипотетический) минус один день
  • нулевой й месяц в отличие от первых, дает (гипотетический) минус один месяц

Возьмите (гипотетический) 1 января в году 0, вычтите месяц -> 1 декабря в году -1. Вычесть день -> 30-го ноября в год -1

С другой стороны, они могли бы выбрать, чтобы исправить день первый, то он пошел бы, как: 1 января минус 1d -> 31 декабря -0001 , минус 1mo -> 30-е ноябрь -0001

Форматирование, очевидно, проверяет привязку только для выдачи допустимых дат. (Для некоторого определения `` valid '')

+0

Да, это имеет смысл (хотя я бы предпочел, чтобы php просто вернул false), какой-то странный программист заполнил мою базу данных этими датами, и на мгновение я забыл, что не было такой вещи, как день 0 или месяц 0. Угадай Я слишком привык рассчитывать с 0. По крайней мере, теперь я узнал что-то новое о том, как php лечит даты. : P –

+0

Хе-хе, ну, интересно, sql '92 * позволяет * нулевой месяц и день, и я предполагаю, что здесь происходит много путаницы. – hroptatyr