这些日期之间有几个小时?

时间:2012-10-29 10:23:37

标签: php datetime dst

  

可能重复:
  How do you handle timezone difference calculation in PHP?

昨天在瑞典改为夏令时,我遇到了一些问题。我正在使用PHP DateTime,DateTimeZone,DateTimePeriod等,并且不同意结果。

您对这些日期与小时数之间的天数有何看法?

"Sun, 28 Oct 2012 01:00:00 +0200"
"Mon, 29 Oct 2012 00:00:00 +0100"

PHP告诉我这是0天23小时。我会说它是0天,但是24小时。

更新:时区为“欧洲/斯德哥尔摩”,因此两个日期的时区相同。

重现:

$timezone = new DateTimeZone("Europe/Stockholm");
$date1 = new DateTime("Sun, 28 Oct 2012 01:00:00", $timezone);
$date2 = new DateTime("Mon, 29 Oct 2012 00:00:00", $timezone);
$date1->setTimezone($timezone);
$date2->setTimezone($timezone);
$diff = $date1->diff($date2);
var_dump($diff);

更新2:

使用Java和JodaTime类,它给了我24小时。因此,正确的答案显然不明显:)

2 个答案:

答案 0 :(得分:1)

你正在处理夏令时。

如你所知,在十月份,我们在一夜之间有一个额外的小时插入时钟。在DST结束时,午夜之间的小时重复1AM。这意味着在10月28日星期日,“凌晨1点”的时间含糊不清。其中有两个。凌晨1点发生了两次。

这意味着那里没有一个准确的答案,“在星期日凌晨1点和任何其他时间之间有多少小时。”有两个有效的答案。 PHP给你一个,但你期待另一个。

只要您使用本地时区计算时间,此问题就无法解决。唯一的解决方案是始终将UCT用于所有日期计算和日期存储,并且只有在您实际向用户显示时间时才切换到本地时区。

答案 1 :(得分:0)

$time = strtotime("Mon, 29 Oct 2012 00:00:00 +0100")-strtotime("Sun, 28 Oct 2012 01:00:00 +0200");
$days=$time/(24*60*60);
echo $days;