Для начала разберемся что такое GMT и UTC. Во многих источниках они упоминаются как синонимы, и между ними действительно не существенная разница (до 1 секунды).
Их отличие в методике получения точного значения. UTC (универсальное координированное время) измеряется благодаря высокоточным атомным часам. GMT (Время гринвичского или нулевого меридиана) получают благодаря астрономическим расчетам. При этом UTC периодически подгоняют, чтобы расхождение с GMT составляло не более секунды.
Для бытовых целей это расхождение не важно и потому UTC и GMT можно использовать как одно и тоже число.
Время, используемое в PHP
Если речь идет о функции time(), то она возвращает так называемый UNIX_TIMESTAMP, время в секундах с 1 Января 1970 года для нулевого меридиана (т.е не зависит от установленного часового пояса).
А как работает ф-ция date()? Какое время возвращает «по умолчанию»? Для какого часового пояса?
Установка по умолчанию часового пояса выполняется в файле php.ini. Например, здесь установлен часовой пояс Лос Анджелеса:
1 2 3 4 |
[Date] ; Defines the default timezone used by the date functions ; http://php.net/date.timezone date.timezone = America/Los_Angeles |
Но если настройки не менялись после установки PHP, то обычно вы там обнаружите UTC, что соответствует часовому поясу GMT:
1 2 3 4 |
[Date] ; Defines the default timezone used by the date functions ; http://php.net/date.timezone date.timezone = UTC |
В программе, вы можете установить нужный вам часовой пояс. Это можно сделать вот так:
1 2 |
//поменять часовой пояс в массиве загруженных в память настроек php ini_set('date.timezone', 'UTC'); |
или так:
1 2 |
//установка часового пояса по умолчанию date_default_timezone_set('UTC'); |
Если используется второй способ, то он устанавливает приоритетное значение часового пояса для функций времени в PHP.
Функция date(), показывает время именно для того часового пояса, который установлен в текущий момент в настройках или date_default_timezone_set().
Как узнать разницу времени между локальным часовым поясом и GMT?
Мы разобрались, что date() показывает время для выбранного часового пояса. Разницу времени локального времени (LT) от GMT и текущий код часового пояса можно получить с помощью соответствующих ключей функции. Рассмотрим следующий пример.
1 2 3 4 5 6 7 8 |
ini_set('date.timezone', 'Asia/Yekaterinburg'); echo date('d.m.Y H:i:s Z e P T') . "\n"; date_default_timezone_set('GMT'); echo date('d.m.Y H:i:s Z e P T'); //выведет 14.01.2016 20:23:14 21600 Asia/Yekaterinburg +06:00 YEKT 14.01.2016 14:23:14 0 GMT +00:00 GMT |
Т.е. ключи выводят
Z — разницу в секундах, при этом пояса западнее GMT дают отрицательные значения, а восточнее — положительные;
e — идентификатор часового пояса (появился в PHP 5.1);
P — разница с GMT в часах и минутах (появился в PHP 5.1.3),
T — аббревиатура часового пояса.
Есть и другие ключи, все они перечислены в документации функции date().
Кстати, довольно скоро (19 января 2038) для хранения времени в таком формате уже не будет хватать 32 битного целого числа со знаком. Вполне возможно, что 32 битных приложений уже к тому времени не останется, так что проблемы переполнения не возникнет. 64х-битной переменной уже должно хватить на 292 млрд. лет. Можно уже сейчас проектировать базы данных с учетом этого факта.
Когда отображаете время, всегда включайте в него смещение часового пояса. Формат времени без смещения бесполезен.
Каким образом часовой пояс влияет на значение, возвращаемое time()? В документации в комментариях справедливо пишут, что timestamp не зависит от часового пояса…
Спасибо, Василий, там была ошибка, вместо функции time() конечно же подразумевалась функция date(). Это видно в приводимых примерах.