Как получить смещение часового пояса от GMT + 0 в php? - PullRequest
11 голосов
/ 04 февраля 2012

Я не эксперт в php. Я знаю, что часовые пояса поддерживаются в PHP.

Для данного часового пояса TZ, поддерживаемого PHP, мне нужно извлечь смещение (то есть количество часов и минут, чтобы добавить или вычесть) к известному UTC (т.е. GMT + 0), чтобы получить это время в зоне TZ.

Как мне этого добиться? В конечном итоге мне нужно получить эти смещения для всех поддерживаемых часовых поясов в PHP. Благодарю.

Ответы [ 5 ]

22 голосов
/ 09 января 2014

Это будет полезно для преобразования значений смещения в формат 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');
20 голосов
/ 04 февраля 2012

Это простой пример того, как получить смещение часового пояса в секундах:

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

рабочий пример

14 голосов
/ 03 ноября 2012

Это даст вам стандартное смещение (а не в или из DST [в зависимости от времени года]):

function getStandardOffsetUTC($timezone)
{
    if($timezone == 'UTC') {
        return '';
    } else {
        $timezone = new DateTimeZone($timezone);
        $transitions = array_slice($timezone->getTransitions(), -3, null, true);

        foreach (array_reverse($transitions, true) as $transition)
        {
            if ($transition['isdst'] == 1)
            {
                continue;
            }

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

        return false;
    }
}

Использование:

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

Вы можете взглянуть на различия здесь .

6 голосов
/ 23 октября 2016

Это возможно только следующей строкой.

echo (new DateTime('now', new DateTimeZone( 'Asia/Kabul' )))->format('P');
2 голосов
/ 04 февраля 2012

Для всех поддерживаемых часовых поясов в 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);
...