php间隔和时区

Posted

技术标签:

【中文标题】php间隔和时区【英文标题】:php interval and timezone 【发布时间】:2015-04-23 01:49:30 【问题描述】:

我想获取使用夏令时的时区中两个日期之间的日期时间间隔。

以下片段显示了问题。

$timezone = new DateTimeZone('UTC');
$from_date_obj = DateTime::createFromFormat('Y-m-d H:i:s', '2014-10-31 23:59:59',$timezone);
$to_date_obj = DateTime::createFromFormat('Y-m-d H:i:s', '2014-11-20 23:47:02',$timezone);
$interval = $from_date_obj->diff($to_date_obj, TRUE);
print_r($interval);

对于 UTC 时区,这显示:

DateInterval Object
(
[y] => 0
[m] => 0
[d] => 19
[h] => 23
[i] => 47
[s] => 3
[weekday] => 0
[weekday_behavior] => 0
[first_last_day_of] => 0
[invert] => 0
[days] => 19
[special_type] => 0
[special_amount] => 0
[have_weekday_relative] => 0
[have_special_relative] => 0
)

现在这个:

$timezone = new DateTimeZone('America/Los_Angeles');
$from_date_obj = DateTime::createFromFormat('Y-m-d H:i:s', '2014-10-31 23:59:59',$timezone);
$to_date_obj = DateTime::createFromFormat('Y-m-d H:i:s', '2014-11-20 23:47:02',$timezone);
$interval = $from_date_obj->diff($to_date_obj, TRUE);
print_r($interval);

显示:

DateInterval Object 
(
[y] => 0
[m] => 0
[d] => 20
[h] => -1
[i] => 47
[s] => 3
[weekday] => 0
[weekday_behavior] => 0
[first_last_day_of] => 0
[invert] => 0
[days] => 19
[special_type] => 0
[special_amount] => 0
[have_weekday_relative] => 0
[have_special_relative] => 0
)

UTC 显示 19 天/23 小时/47 分 3 秒。 PT 显示 20 天/-1 小时/47 分 3 秒。我认为 PT 的正确答案应该是 20 天/0 小时/47 分 3 秒。

有什么方法可以在太平洋时区进行差异化而不是以负小时结束? -1 小时指示是否是预期的结果,它究竟意味着什么?


更新:我发现 php 似乎并没有处理这里讨论的 DST 的差异:

PHP's DateTime::Diff gets it wrong?

就我得到的结果而言,它似乎是上面链接中所示的 PHP 错误。

【问题讨论】:

【参考方案1】:

您使用的是什么 php 版本?我得到了第二个代码块的这个结果-

DateInterval Object ( 
[y] => 0 
[m] => 0 
[d] => 19 
[h] => 23 
[i] => 47 
[s] => 3 
[weekday] => 0 
[weekday_behavior] => 0 
[first_last_day_of] => 0 
[invert] => 0 
[days] => 19 
[special_type] => 0 
[special_amount] => 0 
[have_weekday_relative] => 0 
[have_special_relative] => 0 
)

这两个代码应该显示相同的结果,因为您每次比较相同的日期和不同的时区

【讨论】:

嗯...版本 5.4.29 我从持续时间计算器中得到了 20 天 0 小时。我认为两天之间的差异是不一样的,因为在 PT 中时钟改变了一小时。例如。 2014-11-01 23:59 和 2014-11-02 23:59 之间的差异我认为是 1 天 1 小时,因为时钟改变了 1 小时。 但是如果他们在同一个时区,他们之间没有 1 小时的变化......我们以纽约为例,纽约的一个人与纽约的另一个人有相同的时间,对吗?因此,如果他们自己比较时间,他们就不需要更改时钟。您可能在两个日期之间遇到的唯一问题是 DST 部分,这就是为什么您的所有时间都应保存为 UTC,然后更容易转换日期【参考方案2】:

这里提出了两个问题: 当由于 DST(夏令时)而发生时钟更改时,与两个日期和时间之间的差异有关。实际上,两个日期和时间之间的差异应该考虑到时钟的变化,但显然它没有。

这在以下链接中有很好的记录:

PHP's DateTime::Diff gets it wrong?

此外,我将 -1 问题归结为 php 错误。由于 PHP 无论如何都不会处理两个日期时间之间的 DST 更改,而且在我的情况下,没有使 DST 生效的差异无论如何都足够接近,我将只在 UTC 中进行差异计算。

【讨论】:

以上是关于php间隔和时区的主要内容,如果未能解决你的问题,请参考以下文章

一个时间戳间隔8小时 时区的问题

PHP 日期时间函数详解

PHP时区问题

修改 linux 时区时间和 php 时区

PHP日期和时间函数之系统时区设置

PHP PHP时区缩写在数组时区或所有时区中