有 2 台服务器(CentOS),相同的 php 脚本工作方式不同。更准确地说,它对 UTC 和 GMT 时区有不同的偏移量,但它们在同一个时区并且没有时差(字面意思是一秒)。
您能否告诉我可能导致以下行为/碰撞的原因?
输入数据:
第一台服务器:
date -u
= 2021 年 12 月 28 日星期二 07:29:41 UTCdate +'%:z %Z'
= +00:00 格林威治标准时间zdump /etc/localtime
= 格林威治标准时间 2021 年 12 月 28 日星期二 07:30:21ls -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
= 2021 年 12 月 28 日星期二 07:31:01 UTCdate +'%:z %Z'
= +00:00 世界标准时间zdump /etc/localtime
= 2021 年 12 月 28 日星期二 07:31:29 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'));
第一台服务器上的结果(时区=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"