gpt4 book ai didi

php 在使用澳大利亚/悉尼时区时给出错误答案

转载 作者:可可西里 更新时间:2023-10-31 23:21:52 25 4
gpt4 key购买 nike

我正在开发一个在澳大利亚运行的网站。

所以我把时区设置如下。

date_default_timezone_set('Australia/Sydney');

我需要计算两个日期之间的天数。

我在 10 月份发现了一个奇怪的行为。

 $now = strtotime('2013-10-06'); // or your date as well
$your_date = strtotime('2013-10-01');
$datediff = $now - $your_date;
echo floor($datediff/(60*60*24));//gives output 5, this is right



$now = strtotime('2013-10-07'); // or your date as well
$your_date = strtotime('2013-10-01');
$datediff = $now - $your_date;
echo floor($datediff/(60*60*24));//gives output 5, this is wrong, but it should be 6 here

在 2013-10-07 之后,它总是少给一天答复。其他时区没问题。可能是由于夏令时。但是解决方案是什么。

请帮忙。

谢谢

最佳答案

为什么说 5,为什么这在技术上是正确的

Sydney ,夏令时从 2013 年 10 月 6 日 02:00:00 开始 - 所以您在跨越该日期的日期中损失了一个小时。

当您调用 strtime 时,它​​会将时间解释为悉尼时间,但会返回 Unix 时间戳。如果将第二组时间戳转换为 UTC,则范围从 2013-09-30 14:00:00 到 2013-10-06 13:00:00,这还不到 6 天,所以得到向下舍入为 5。

如何在忽略 DST 转换的情况下获取时差

尝试使用 DateTime对象代替,例如

$tz=new DateTimeZone('Australia/Sydney');
$start=new DateTime('2013-10-01', $tz);
$end=new DateTime('2013-10-07', $tz);

$diff=$end->diff($start);

//displays 6
echo "difference in days is ".$diff->d."\n";

为什么 DateTime::diff 的工作方式不同?

您可能会问“为什么这样行得通?” - 毕竟,这些时间之间真的没有 6 天,而是 5 天 23 小时。

原因是DateTime::diff实际上更正了 DST 转换。我必须阅读源代码才能弄清楚 - 更正发生在内部 timelib_diff功能。如果以下所有条件都为真,则会进行此更正

  • 每个 DateTime 使用相同的时区
  • 时区必须是geographic id而不是像GMT这样的缩写
  • 每个 DateTime 必须有不同的 DST 偏移量(即一个在 DST 中,一个不在 DST 中)

为了说明这一点,下面是如果我们在切换到 DST 的两边仅几个小时内使用两次会发生什么

$tz=new DateTimeZone('Australia/Sydney');
$start=new DateTime('2013-10-06 00:00:00', $tz);
$end=new DateTime('2013-10-06 04:00:00', $tz);

//diff will correct for the DST transition
$diffApparent=$end->diff($start);

//but timestamps represent the reality
$diffActual=($end->getTimestamp() - $start->getTimestamp()) / 3600;

echo "Apparent difference is {$diffApparent->h} hours\n";
echo "Actual difference is {$diffActual} hours\n";

这输出

Apparent difference is 4 hours
Actual difference is 3 hours

关于php 在使用澳大利亚/悉尼时区时给出错误答案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17184626/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com