使用DateTime / DateTimeZone在PHP中调整时区

时间:2009-09-18 14:57:08

标签: php datetime timezone

有很多关于在PHP中进行时区调整的信息,但由于所有的噪音,我没有找到具体的答案。

考虑到一个时区的时间,我想将其转换为另一个时区的时间。

This本质上是我想做的,但我需要能够只使用内置的PHP库而不是PEAR Date。

这就是我一直在做的事情,但似乎总是给我相对于GMT的偏移量:

$los_angeles_time_zone = new DateTimeZone('America/Los_Angeles');
$hawaii_time_zone = new DateTimeZone('Pacific/Honolulu');

$date_time_los_angeles = new DateTime('2009-09-18 05:00:00', $los_angeles_time_zone);
printf("LA Time: %s<br/>", $date_time_los_angeles->format(DATE_ATOM));

$time_offset = $hawaii_time_zone->getOffset($date_time_los_angeles);
printf("Offset: %s<br/>", $time_offset);

这是输出:

  

洛杉矶时间:2009-09-18T05:00:00-07:00
  抵消:-36000

我期待3小时(10800秒)。但是'-7:00'的事情告诉我它保留了与GMT相关的一切,这也许可以解释为什么它给了我“绝对”的偏移。

如果没有所有GMT hoohah,我如何获得两个时区之间的偏移?

感谢。

更新:

我发现我能做到这一点并得到我想要的东西:

    $date_time_los_angeles = new DateTime('2009-09-18 05:00:00', $los_angeles_time_zone);
printf("LA Time: %s<br/>", $date_time_los_angeles->format(DATE_ATOM));

$date_time_hawaii = new DateTime('2009-09-18 05:00:00', $hawaii_time_zone);
printf("Hawaii Time: %s<br/>", $date_time_hawaii->format(DATE_ATOM));


$time_offset = $los_angeles_time_zone->getOffset($date_time_los_angeles) - $hawaii_time_zone->getOffset($date_time_los_angeles);
printf("Offset: %s<br/>", $time_offset);

但对我来说感觉很尴尬。有人知道更清洁的方法吗?

3 个答案:

答案 0 :(得分:8)

以下是使用DateTime类的一些函数。第一个将返回两个时区之间的秒数差异。第二个返回从一个时区到另一个时区的时间“翻译”。

function timezone_diff($tz_from, $tz_to, $time_str = 'now')
{
    $dt = new DateTime($time_str, new DateTimeZone($tz_from));
    $offset_from = $dt->getOffset();
    $timestamp = $dt->getTimestamp();
    $offset_to = $dt->setTimezone(new DateTimezone($tz_to))->setTimestamp($timestamp)->getOffset();
    return $offset_to - $offset_from;
}

function time_translate($tz_from, $tz_to, $time_str = 'now', $format = 'Y-m-d H:i:s')
{
    $dt = new DateTime($time_str, new DateTimezone($tz_from));
    $timestamp = $dt->getTimestamp();
    return $dt->setTimezone(new DateTimezone($tz_to))->setTimestamp($timestamp)->format($format);
}

演示:

$los_angeles_time = '2009-09-18 05:00:00';
$los_angeles_tz   = 'America/Los_Angeles';
$hawaii_tz        = 'Pacific/Honolulu';

$los_angeles_hawaii_diff = timezone_diff($los_angeles_tz, $hawaii_tz, $los_angeles_time);
echo $los_angeles_hawaii_diff . '<br />';

$hawaii_time = time_translate($los_angeles_tz, $hawaii_tz, $los_angeles_time);
echo $hawaii_time . '<br />';

答案 1 :(得分:1)

正如GZipp评论的那样,他的代码实际上只适用于PHP&gt; = 5.3.0。这很好,但是 - 这是一个适用于PHP&gt; = 5.2.0的版本。 (顺便提一下,它也适用于5.3+,并且功能调用少了2次)

<?php
function time_translate($tz_from, $tz_to, $time_str = 'now', $format = 'Y-m-d H:i:s')
{
    $dt = new DateTime($time_str, new DateTimezone($tz_from));
    $dt->setTimezone(new DateTimezone($tz_to));
    return $dt->format($format);
}

$time_diffs = array('now', '-1 hour', '-1 day', '-1 week', '-1 month', '+1 hour', '+1 week', '+1 month');

foreach ($time_diffs as $diff)
{
 echo "{$diff}:"
  . "\n\t"
  . "Current: " . date("Y-m-d H:i:s", strtotime($diff))
  . "\n\t"
  . "UTC: " . time_translate("US/Eastern", "UTC", $diff)
  . "\n\n";
}

答案 2 :(得分:0)

简单地从第二次开始减去第一次。

您将能够以秒为单位获得时差。