0

可能重复:
您如何处理 PHP 中的时区差异计算?

在昨天对瑞典 DST 的更改中,我遇到了一些我编写的代码的问题。我正在使用 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 小时。所以显然正确的答案并不明显:)

4

2 回答 2

1

您正在处理夏令时。

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

这意味着对于“周日凌晨 1 点到任何其他给定时间之间有多少小时”根本没有准确的答案。有两个有效的答案。PHP 给你一个,但你期待另一个。

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

于 2012-10-29T10:41:16.420 回答
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; 
于 2012-10-29T10:29:18.743 回答