PHP   发布时间:2022-04-05  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了PHP-strftime()和gmstrftime()返回“%s”的错误结果大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

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函数的问题!

解决方法:

差异似乎在于时区的设置方式.以下测试将显示strftime认为无论使用date_default_timezone_set进行了什么设置,都存在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);

它应该工作.根据the documentation they’ve provided,这肯定是不正确的行为.

大佬总结

以上是大佬教程为你收集整理的PHP-strftime()和gmstrftime()返回“%s”的错误结果全部内容,希望文章能够帮你解决PHP-strftime()和gmstrftime()返回“%s”的错误结果所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: