计算不同时区的日期之间的小时数

时间:2016-06-01 07:48:55

标签: php datetime timezone datetime-format timezone-offset

我有一组日期(在GMT的不同时区),我想计算从第一个和最后一个日期之间经过的小时数。

例如,这将是一个日期数组:

[
    1 => 2016-06-05T08:45:00.000+02:00,
    2 => 2016-06-05T09:55:00.000+02:00,
    3 => 2016-06-05T12:10:00.000+02:00,
    4 => 2016-06-05T14:25:00.000-04:00
]

我想计算自索引1到2,2到3和3到4的日期以来经过的小时数。问题是我不知道如何根据时区计算,如果我必须添加或减去小时数以获得正确的结果。

我需要知道如何计算开发代码。这将是某种东西(由于缺乏根据时区计算):

$tIda = 0;

foreach ($times0 as $i => $time)
{
    if ($i < sizeof($times0) - 1)
    {
        $datetime1 = strtotime(substr($time, 0, 10) . ' ' . substr($time, 11, 8));
        $datetime2 = strtotime(substr($times0[$i + 1], 0, 10) . ' ' . substr($times0[$i + 1], 11, 8));
        $interval  = abs($datetime2 - $datetime1);
        $tIda += round($interval / 60);
    }
}

感谢。

3 个答案:

答案 0 :(得分:2)

最好的解决方案是使用DateTime类。

首先,从日期字符串创建\DateTime个对象:

$datetime1 = new \DateTime($time);
$datetime2 = new \DateTime($times0[$i + 1]);

然后,您可以使用diff()方法计算两个日期之间的差异:

$diff = $datetime1->diff($datetime2);

$diff\DateTimeInterval的一个实例,您可以按照自己喜欢的方式格式化这种差异,例如:

$diff->format('%H:%I:%S')

答案 1 :(得分:1)

strtotime()解析时区就好了:

$a = '2016-06-05T12:10:00.000+02:00';
$b = '2016-06-05T14:25:00.000-04:00';

$ts_a = strtotime($a);
$ts_b = strtotime($b);
var_dump($a, date('r', $ts_a), $b, date('r', $ts_b));
string(29) "2016-06-05T12:10:00.000+02:00"
string(31) "Sun, 05 Jun 2016 12:10:00 +0200"
string(29) "2016-06-05T14:25:00.000-04:00"
string(31) "Sun, 05 Jun 2016 20:25:00 +0200"

...一旦你有了一个Unix时间戳,就可以忘记时区,因为Unix时间戳是一个固定的时刻(不是相对的本地时间)。

由于您已为DateTime类添加了标记:

$a = '2016-06-05T12:10:00.000+02:00';
$b = '2016-06-05T14:25:00.000-04:00';

$dt_a = new DateTime($a);
$dt_b = new DateTime($b);
var_dump($dt_a->diff($dt_b)->format('%h')); // Prints: 8

答案 2 :(得分:0)

您应该使用DateTimeDateInterval类。他们会为你处理所有的时间。

foreach ($times as $i => $time) {
    if ($i > 0) { // not on the 1st element
        $datetime1 = new DateTime($times[$i-1]);
        $datetime2 =  new DateTime($times[$i]);
        $interval = $datetime1->diff($datetime2);
        $interval_hours = ($interval->invert ? -1 : 1) * ($interval->days *24 + $interval->h);
        // days are the total days, h are the hours in day
        // invert is negative, if $datetime2 is before $datetime1
        echo "Diff from ".$times[$i-1]." to ".$times[$i].": ".$interval_hours."\n";
    }
}