如何在php中获取与GMT+0的时区偏移量?

18

我不是php专家。我知道PHP支持时区

对于PHP支持的给定时区TZ,我需要检索偏移量(即要添加或减去的小时和分钟数),以获取在TZ区域中的时间,这是已知的UTC(即GMT + 0)。

我如何实现这一点?最终,我需要获取PHP中所有受支持时区的这些偏移量。谢谢。


你不能仅将默认时区设置为所需的时区吗? - Jivings
我需要反向操作。 - Jérôme Verstrynge
请查看我下面的单行回答:**below**。 - MNR
5个回答

29

这将有助于将偏移值转换为GMT格式,无需任何计算。

<?php

  //target time zone
  $target_time_zone = new DateTimeZone('America/Los_Angeles');

  //find kolkata time 
  $date_time = new DateTime('now', $target_time_zone);

  //get the exact GMT format
  echo 'GMT '.$date_time->format('P');

简单使用内置API。太棒了! - Jimmy Ilenloa
1
这是最好的答案! - Anibal Sanchez
这不正确,只测试了“America/Sao_Paulo”,但它给出的是GMT-02:00,而当前应该是GMT-03:00。 - James
@James,时区America/Sao_Paulo目前处于UTC-3。这是对2017年最初计划的时区的更改(到现在为止,夏令时已经开始,将我们置于UTC-2)。 - Sundar
如何从输出中分别提取小时和分钟? - rahim.nagori

25

以下是一个简单的示例,如何获取时区偏移量(以秒为单位):

$dtz = new DateTimeZone('Europe/Sofia');
$time_in_sofia = new DateTime('now', $dtz);
echo $dtz->getOffset( $time_in_sofia );

以GMT+x格式显示:

$offset = $dtz->getOffset( $time_in_sofia ) / 3600;
echo "GMT" . ($offset < 0 ? $offset : "+".$offset);

工作示例


@Raceimaztion 不要批准无效的编辑。审核是一项严肃的责任,需要您仔细注意,您已经连续批准了101个编辑,这是不可信的。 - Chris Stratton
1
请注意,实际答案格式是错误的: 答案说明偏移量使用GMT标准,而实际上它使用UTC标准。GMT(格林威治标准时间)受夏令时影响,这意味着在夏季GMT将从UTC+0变为UTC+1。 例如,像意大利这样的国家,在夏季时间会得到UTC+2,而其标准时间是GMT+1或UTC+1。使用“Europe/Rome”测试此代码返回了“GMT+2”,这是不正确的,该代码实际上返回了UTC值。 - Giacomo Pigani
@Teneff,你能写一行代码吗?在某些情况下这可能更方便... :) - HX_unbanned
1
@GiacomoTecyaPigani 不,格林威治标准时间在夏季不会改变。GMT和UTC之间的区别在于UTC由原子钟控制,因此UTC是对GMT的可追踪近似。 - user58955
如上所述,GMT并不会改变时区,只是在GMT和BST(英国夏令时)之间切换,而BST相当于GMT+1小时。就大多数情况而言,UTC和GMT几乎是相同的。 - Void

14
这将为您提供标准偏移量(而不是DST [根据一年中的时间而定]内或外的偏移量):
function getStandardOffsetUTC($timezone)
{
    if($timezone == 'UTC') {
        return '';
    } else {
        $timezone = new DateTimeZone($timezone);
        $transitions = $timezone->getTransitions(time() - 86400*365, time());

        foreach ($transitions as $transition)
        {
            if ($transition['isdst'])
            {
                continue;
            }

            return sprintf('UTC %+03d:%02u', $transition['offset'] / 3600, abs($transition['offset']) % 3600 / 60);
        }

        return false;
    }
}

使用方法:

echo getStandardOffsetUTC('Europe/Sofia'); // UTC +02:00

你可以在这里看到差异的一瞥 here

很好的回答。在foreach行中有一个错别字——多了一个闭合括号。 - George Lund
1
实际上,这个答案存在相当大的问题:获取所有转换非常缓慢,占用大量内存。如果您要为多个时区执行此操作,则可能不是一个好主意。更好的实现可能只获取最近一年的转换 - 请参见http://www.php.net/manual/en/datetimezone.gettransitions.php上的评论,这些评论实际上是有意义的(这是PHP 5.3功能AIUI)。 - George Lund
@GeorgeLund:是的,当时我是为5.2编写的,随意更新它吧。 :-) - Alix Axel
更新了,我觉得支持5.3已经不再必要了 :). 不确定array_reverse和保留键是用来做什么的,请确认一下。看起来工作正常。 - MightyPork

11

只需以下单行代码即可实现。

echo (new DateTime('now', new DateTimeZone( 'Asia/Kabul' )))->format('P');

太棒了。只有一个问题,如何从输出中分别提取小时和分钟? - rahim.nagori
使用explode(":", $value)函数,其中$value是从上面的代码返回的内容。 - DanimalReks

3

PHP支持的所有时区:

$timezone_offsets = array();

foreach(timezone_identifiers_list() as $timezone_identifier)
{
    $date_time_zone = new DateTimeZone($timezone_identifier);
    $date_time = new DateTime('now', $date_time_zone);
    $timezone_offsets[$timezone_identifier] = $date_time_zone->getOffset($date_time);
}

print_r($timezone_offsets);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接