Из-за чего может возникнуть разница между UTC и GMT в PHP скрипте?

Имеется 2 сервера (CentOS), один и тот же php скрипт отрабатывает по разному. Точнее, имеет разный оффсет для UTC и GMT временных зон, но они находятся в одном часовом поясе и не имеют разницы во времени (буквально секунда).

Подскажите пожалуйста, из-за чего может возникнуть следующее поведение/коллизия?

Вводные данные:

  • Первый сервер:

    date -u = Tue Dec 28 07:29:41 UTC 2021

    date +'%:z %Z' = +00:00 GMT

    zdump /etc/localtime = Tue Dec 28 07:30:21 2021 GMT

    ls -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 2021

    date +'%:z %Z' = +00:00 UTC

    zdump /etc/localtime = Tue Dec 28 07:31:29 2021 UTC

    ls -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 шт):

Автор решения: Aleksey Vaganov

Обновите на сервере пакет tzdata и установите симлинк /etc/localtime -> /usr/share/zoneinfo/Etc/UTC

→ Ссылка