Часовой пояс php.ini по умолчанию против date.timezone
Когда я использую функцию PHP date()
на двух разных серверах, я получаю два разных результата, но оба сервера должны быть одинаковыми.
Я проверил файл php.ini
на сервере # 1, где время верное, и выглядит следующим образом:
date/time support enabled
"Olson" Timezone Database Version 0.system
Timezone Database internal
Default timezone America/Chicago
Directive Local Value Master Value
---------------------------------------------------
date.timezone America/Chicago America/Chicago
Я проверил сервер # 2 и выглядит следующим образом:
date/time support enabled
"Olson" Timezone Database Version 0.system
Timezone Database internal
Default timezone UTC
Directive Local Value Master Value
---------------------------------------------------
date.timezone America/Chicago America/Chicago
Единственное отличие, которое я вижу, это значение "Значение по умолчанию".
Дата/время для отображения обоих серверов:
Server #1: 10/23/2012 09:40:39
Server #2: 10/23/2012 14:40:39
Я подтвердил, что оба сервера используют php.ini
, расположенный внутри /etc
, и я также искал оба веб-каталога для любого места, где временная зона может быть перезаписана:
grep -r "date_default_timezone_set" *
Но в этом отношении оба они содержат одинаковые файлы с одинаковыми настройками.
Является ли "часовой пояс по умолчанию" тем, что вызывает разницу в 5 часов? Если да, то как его исправить?
UPDATE
Загруженные файлы конфигурации.
Сервер № 2 содержит два дополнительных INI файла:
/etc/php.d/snmp.ini
/etc/php.d/apc.ini
php -i.
Сервер # 1:
date/time support => enabled
"Olson" Timezone Database Version => 0.system
Timezone Database => internal
Default timezone => America/Chicago
Directive => Local Value => Master Value
date.timezone => America/Chicago => America/Chicago
Сервер # 2:
date/time support => enabled
"Olson" Timezone Database Version => 0.system
Timezone Database => internal
Default timezone => America/Chicago
Directive => Local Value => Master Value
date.timezone => America/Chicago => America/Chicago
Интересно отметить, что по какой-то причине "Часовой пояс по умолчанию" не совпадает на сервере №2 при просмотре через php -i
по сравнению с phpinfo()
на веб-странице.
Решение
Проблема была в CMS и его плагинах. Хотя на серверах # 1 и # 2 были одинаковые файлы и все, оказалось, что плагины не загружаются в том же порядке на каждом сервере, что позволило последнему подключенному плагину определить часовой пояс моего script.
Причина php -i
и phpinfo
отличается тем, что после использования date_default_timezone_set()
это влияет на то, что будет печатать phpinfo()
.
Исправление было гарантией того, что я нахожусь в часовом поясе, в котором мне нужно было пройти через date_default_timezone_set()
. Причина, по которой я не работал, прежде чем я разместил этот вопрос, состоял в том, что я объявил об этом до загрузки нескольких необходимых файлов из CMS, которые, вероятно, снова установили там часовой пояс.
Ответы
Ответ 1
date()
опирается на date.timezone Настройка INI. Поскольку один из них - Чикаго (CT), а другой - UTC, это ваша разница в 5 часов.
Я считаю, что с PHP > 5.2 вы должны получить:
PHP Предупреждение: Неизвестно: безопасно полагаться на системный часовой пояс Настройки. Вы должны использовать настройку date.timezone или date_default_timezone_set().
Я бы посоветовал вам взглянуть на новый объект DateTime или использовать UTC в соответствии с рекомендациями SDC.
Ответ 2
Несколько вещей, чтобы проверить:
- Проверьте значение "Загруженный файл конфигурации" на вашем выходе phpinfo(), чтобы убедиться, что вы изменяете правильный файл php.ini. (Это укусило меня не один раз!)
- При просмотре вывода phpinfo() проверьте строку "Дополнительные файлы с расширением .ini", чтобы увидеть, есть ли дополнительные файлы ini, которые обрабатываются при запуске через ваш веб-сервер.
- date.timezone можно установить через функцию ini_set. У вас есть код, который делает это? Обязательно проверьте любой код, который может быть запущен из-за установки auto_prepend ini.
Ответ 3
Вот код:
[Date]
date.timezone = ('America/New_York')
date.default_latitude = 31.7667
date.default_longitude = 35.2333
date.sunrise_zenith = 90.583333
date.sunset_zenith = 90.583333
Просто измените date.timezone = ('America/New_York')
на нужный часовой пояс.
Источник.
Ответ 4
http://us.php.net/manual/en/function.date-default-timezone-get.php
Среда TZ имеет приоритет над значением по умолчанию php.ini; возможно, причина. Вы можете исправить это, явно указав date_default_timezone_set.
Ответ 5
Использование Ubuntu 14.0 LTS
Часовой пояс по умолчанию в моем случае был установлен в:
/etc/php5/cli/php.ini
Затем я мог бы проверить:
php -i | grep "часовой пояс"
Ответ 6
Если вы устанавливаете значение date.timezone в php.ini, но оно не работает (то есть локальное значение и значение мастера различаются), вам может потребоваться обновить что-то вроде этого в файле конфигурации apache:
<IfModule mod_php5.c>
php_value date.timezone "Europe/Paris"
</IfModule>
Моду, который удалил вышеуказанный ответ раньше: я искал часы, чтобы найти это решение. Не удаляйте ответ только потому, что считаете, что это дублированный ответ.