计算不同时区日期之间的小时数
Calculate hours between dates in different time zones
我有一个日期数组(在格林威治标准时间的不同时区),我想计算第一个日期和最后一个日期之间经过的小时数。
例如,这将是一个日期数组:
[
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);
}
}
谢谢。
最好的解决方案是使用 DateTime
类.
首先,您从日期字符串创建 \DateTime
个对象:
$datetime1 = new \DateTime($time);
$datetime2 = new \DateTime($times0[$i + 1]);
然后你可以使用diff()
方法计算两个日期之间的差异:
$diff = $datetime1->diff($datetime2);
$diff
是 \DateTimeInterval
的实例,您可以按照自己喜欢的方式格式化此差异,例如:
$diff->format('%H:%I:%S')
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
class 添加了标签:
$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
你应该使用 DateTime
and DateInterval
类。他们将为您解决所有时区问题。
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";
}
}
我有一个日期数组(在格林威治标准时间的不同时区),我想计算第一个日期和最后一个日期之间经过的小时数。
例如,这将是一个日期数组:
[
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);
}
}
谢谢。
最好的解决方案是使用 DateTime
类.
首先,您从日期字符串创建 \DateTime
个对象:
$datetime1 = new \DateTime($time);
$datetime2 = new \DateTime($times0[$i + 1]);
然后你可以使用diff()
方法计算两个日期之间的差异:
$diff = $datetime1->diff($datetime2);
$diff
是 \DateTimeInterval
的实例,您可以按照自己喜欢的方式格式化此差异,例如:
$diff->format('%H:%I:%S')
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
class 添加了标签:
$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
你应该使用 DateTime
and DateInterval
类。他们将为您解决所有时区问题。
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";
}
}