Почему PHP считает плохую идею полагаться на системный часовой пояс?

Я немного недоволен обновлением часового пояса PHP. Мне очень нравится, что все остальное в моей системе доверяет тому, что я правильно соблюдаю системный часовой пояс. Возможно, могут быть случаи использования, когда было бы полезно настроить PHP по-разному, но почему PHP предупреждает меня о том, что использование моего часового пояса небезопасно?

Предупреждение: date(): не безопасно полагаться на настройки системного часового пояса. Вы должны использовать параметр date.timezone или функцию date_default_timezone_set().

Ответы

Ответ 1

Вот что говорят об этом разработчики PHP (в обсуждение):

Нет - вы, как администратор, должны принять обоснованное решение о что вы хотите, чтобы ваш часовой пояс был. Было слишком много ошибок отчеты, в которых люди не имели понятия, поэтому теперь мы бросаем предупреждение.

Derick Rethans является автором этого коммита, который превратил date_warning из E_STRICT (в PHP 5.2-) в E_WARNING (PHP 5.3 +).

В этом же обсуждении есть довольно звуковое (но явно неудобное) решение этого, примененное MediaWiki:

Собственно, разумное значение по умолчанию - это то, что guess_timezone() уже делает, кроме без предупреждений. Вы можете получить это поведение, например,

date_default_timezone_set( @date_default_timezone_get() );

в верхней части вашей программы. Что делает MediaWiki (за исключением изменяя error_reporting вместо использования @). Мы украли эту идею из другое веб-приложение. Это более удобно, чем дублирование функциональность guess_timezone() в приложении.

Это Derick прерогатива раздражает всех пользователей до смерти предупреждений, поскольку его способ указать на его отвращение к состоянию ОС поддержка запроса системного часового пояса. То вознаграждение, которое мы ему даем для написания большого количества кода даты/времени.

Ключевой частью этого обходного пути является date_default_timezone_get функция, которая, в порядке, возвращает часовой пояс по умолчанию...

  • чтение часового пояса с помощью функции date_default_timezone_set() (если есть)
  • чтение переменной окружения TZ (если не пустой) (до PHP 5.3.0)
  • чтение значения параметра date.timezone ini (если установлено)
  • запрос операционной системы хоста (если поддерживается и разрешено ОС)

Ответ 2

Потому что Дерик так сказал. Вот почему. Эта внутренняя цепочка списка рассылки расскажет вам все о логике этого решения. Предупреждение date.timezone является постоянным раздражением для всех, кто использует PHP в качестве языка программирования, а не как замену для знания того, как писать код.

В частности, это поведение меня заводит. Я обычно не злоупотреблял бы системой SO Q & A, чтобы выпустить ее, но это предупреждение заставляет меня бананы. Кроме того, это 1 апреля, так почему бы и нет?

Ответ 3

1) с использованием системы Timezone - это основные издержки производительности.

2) реализации базы данных TZ разными поставщиками имеют исторические проблемы с множеством функциональных проблем

3) есть проблемы вокруг интеллектуальной собственности данных. Его угроза претензий и за счет защиты их, что подрывает такие проекты, - недействительность претензии. Дело 2011 года было урегулировано вне суда, что означает, что этот вопрос был разрешен только в случае истца, а не для решения каких-либо будущих задач.

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

Ответ 4

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