PHP函数strftime()
和gmstrftime()
对于格式"%s"
返回(不同)错误结果。我用CLI 5.5和Apache(OpenSuse)分别用PHP 5.5.14和PHP 7.2.5进行了测试。我使用带DST和不带DST的时间戳。
我的问题:您可以与其他版本/系统一起确认该错误吗?
<?PHP
header('Content-Type: text/plain; charset=utf-8');
$list = array(
1546303600, // 2018-01-01 00:46:40 UTC
1556703600, // 2019-05-01 09:40:00 UTC
);
echo "\ndate_default_timezone_set('UTC')\n";
date_default_timezone_set('UTC');
foreach ( $list as $time )
{
printf("\n%u\n%4s\n%s\n",
$time,
strftime('%s, %F %T %Z',$time),
gmstrftime('%s, %F %T %Z',$time) );
}
echo "\ndate_default_timezone_set('Europe/Berlin')\n";
date_default_timezone_set('Europe/Berlin');
foreach ( $list as $time )
{
printf("\n%u\n%4s\n%s\n",
$time,
strftime('%s, %F %T %Z',$time),
gmstrftime('%s, %F %T %Z',$time) );
}
?>
%s
应该返回原始时间戳,但不会。结果差异为1小时(3600秒)。
date_default_timezone_set('UTC')
1546303600
1546300000, 2019-01-01 00:46:40 UTC <<< WRONG!
1546300000, 2019-01-01 00:46:40 GMT <<< WRONG!
1556703600
1556700000, 2019-05-01 09:40:00 UTC <<< WRONG!
1556700000, 2019-05-01 09:40:00 GMT <<< WRONG!
date_default_timezone_set('Europe/Berlin')
1546303600
1546303600, 2019-01-01 01:46:40 CET
1546300000, 2019-01-01 00:46:40 GMT <<< WRONG!
1556703600
1556703600, 2019-05-01 11:40:00 CEST
1556700000, 2019-05-01 09:40:00 GMT <<< WRONG!
我已将错误报告给bugs.php.net:https://bugs.php.net/bug.php?id=77840
PHP docu告诉:“ %s
的结果与time()
相同”。并且此结果与时区无关(自纪元以来的秒数)。因此strftime("%s",ANY_TIME)
必须返回ANY_TIME
。与gmstrftime()
相同。
Unix工具的日期与预期的一样:
date '+%s %F %T' -d@1556703600
date -u '+%s %F %T' -d@1556703600
TZ=UTC date '+%s %F %T' -d@1556703600
结果是:
1556703600 2019-05-01 11:40:00
1556703600 2019-05-01 09:40:00
1556703600 2019-05-01 09:40:00
所以这不是底层C函数的问题!
答案 0 :(得分:4)
差异似乎取决于时区的设置方式。以下测试将向您显示,无论使用date_default_timezone_set
进行了什么设置,strftime都认为存在UTC偏移量。
date_default_timezone_set("UTC");
echo strftime("%s %z", 1546303600);
date_default_timezone_set("America/Vancouver");
echo strftime("%s %z", 1546303600);
The code似乎应用了从系统时区派生的偏移量,因此您可以尝试以下方法:
putenv("TZ=UTC");
echo strftime("%s %z", 1546303600);
它应该工作。根据{{3}},这显然是不正确的行为。