使用DateTime / DateTimeZone调整PHP中的时区 [英] Adjusting time zone in PHP with DateTime / DateTimeZone

查看:163
本文介绍了使用DateTime / DateTimeZone调整PHP中的时区的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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



在一个时区有一段时间,我想把它转换成另一个时区的时间。



这个本质上是我想要做的,但是我只需要使用内置的PHP库即可,而不是PEAR Date。



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

  $ los_angeles_time_zone = new DateTimeZone (美国/洛杉矶); 
$ 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时间:%s< br />,$ date_time_los_angeles->格式(DATE_ATOM));

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

这是输出:


LA时间:2009-09-18T05:00:00-07:00

偏移量:-36000


我期待3小时(10800秒)。但是'-7:00'的东西告诉我,它保持一切都相对于格林尼治标准时间,这也许解释了为什么它给我绝对的偏移。



得到两个时区之间的偏移量,而不是所有的GMT hoohah?



谢谢。



更新: p>

我发现我可以做到这一点,得到我想要的东西:

  $ 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->格式(DATE_ATOM));

$ date_time_hawaii = new DateTime('2009-09-18 05:00:00',$ hawaii_time_zone);
printf(夏威夷时间:%s< br />,$ date_time_hawaii->格式(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);

但是对我来说感觉很尴尬。任何人都知道一个更干净的方法来做到这一点?

解决方案

这里有几个使用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 ='Ymd 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 ='太平洋/檀香山';

$ 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 />';


There's a lot of info on doing time zone adjustments in PHP, but I haven't found an answer for specifically what I want to do due to all the noise.

Given a time in one timezone, I want to convert it to the time in another timezone.

This is essentially what I want to do, but I need to be able to do it using only the built-in PHP libs, not PEAR Date.

This is what I've been doing, but it seems to always give me the offset relative to 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);

This is the output:

LA Time: 2009-09-18T05:00:00-07:00
Offset: -36000

I was expecting 3 hours (10800 seconds). but the '-7:00' thing tells me it's keeping everything relative to GMT, which maybe explains why it's giving me the "absolute" offset.

How do I just get the offset between the two timezones without all of this GMT hoohah?

Thanks.

UPDATE:

I occured to me that I could do this and get what I want:

    $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);

But it feels awkward to me. Anyone know a cleaner way to do it?

解决方案

Here are a couple of functions using the DateTime classes. The first one will return the difference in seconds between two timezones. The second returns a "translation" of the time from one timezone to another.

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);
}

Demo:

$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 />';

这篇关于使用DateTime / DateTimeZone调整PHP中的时区的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆