Из-за чего может возникнуть разница между UTC и GMT в PHP скрипте?
Имеется 2 сервера (CentOS), один и тот же php скрипт отрабатывает по разному. Точнее, имеет разный оффсет для UTC и GMT временных зон, но они находятся в одном часовом поясе и не имеют разницы во времени (буквально секунда).
Подскажите пожалуйста, из-за чего может возникнуть следующее поведение/коллизия?
Вводные данные:
Первый сервер:
date -u= Tue Dec 28 07:29:41 UTC 2021date +'%:z %Z'= +00:00 GMTzdump /etc/localtime= Tue Dec 28 07:30:21 2021 GMTls -l /etc/localtime= /etc/localtime -> ../usr/share/zoneinfo/Africa/Dakar(new \ReflectionExtension('date'))->info();=date/time support => enabled timelib version => 2018.03 "Olson" Timezone Database Version => 0.system Timezone Database => internal Default timezone => UTC Directive => Local Value => Master Value date.timezone => no value => no value date.default_latitude => 31.7667 => 31.7667 date.default_longitude => 35.2333 => 35.2333 date.sunset_zenith => 90.583333 => 90.583333 date.sunrise_zenith => 90.583333 => 90.583333`Второй сервер:
date -u= Tue Dec 28 07:31:01 UTC 2021date +'%:z %Z'= +00:00 UTCzdump /etc/localtime= Tue Dec 28 07:31:29 2021 UTCls -l /etc/localtime= /etc/localtime -> /usr/share/zoneinfo/Etc/UTC(new \ReflectionExtension('date'))->info();=date/time support => enabled timelib version => 2018.03 "Olson" Timezone Database Version => 0.system Timezone Database => internal Default timezone => UTC Directive => Local Value => Master Value date.timezone => no value => no value date.default_latitude => 31.7667 => 31.7667 date.default_longitude => 35.2333 => 35.2333 date.sunset_zenith => 90.583333 => 90.583333 date.sunrise_zenith => 90.583333 => 90.583333`В php.ini настройка временных зон опущена, строка закомментирована.
Сам скрипт:
$tz = new \DateTimeZone("UTC");
$dt = new \DateTime('now', $tz);
var_dump("UTC offset: " . $tz->getOffset($dt));
$tz1 = new \DateTimeZone("GMT");
$dt1 = new \DateTime('now', $tz1);
var_dump("GMT offset: " . $tz1->getOffset($dt1));
$tz2 = new \DateTimeZone("Africa/Dakar");
$dt2 = new \DateTime('now', $tz2);
var_dump("Africa/Dakar offset: " . $tz2->getOffset($dt2));
date_default_timezone_set('UTC');
var_dump((new \DateTime())->format('Y-m-d H:i:s T'));
date_default_timezone_set('GMT');
var_dump((new \DateTime())->format('Y-m-d H:i:s T'));
Результат на первом сервере (поведение с коллизией при timezone=UTC):
string(17) "UTC offset: 10800" <-- коллизия
string(13) "GMT offset: 0" <-- нет коллизии
string(22) "Africa/Dakar offset: 0"
string(23) "2021-12-28 10:24:23 MSK"
string(23) "2021-12-28 07:24:23 GMT"
Результат на втором сервере (ожидаемое поведение):
string(13) "UTC offset: 0" <-- идентично GMT
string(13) "GMT offset: 0" <-- идентично UTC
string(22) "Africa/Dakar offset: 0"
string(23) "2021-12-28 07:25:21 UTC"
string(23) "2021-12-28 07:25:21 GMT"
Ответы (1 шт):
Обновите на сервере пакет tzdata и установите симлинк /etc/localtime -> /usr/share/zoneinfo/Etc/UTC