Как получить смещение часового пояса от GMT+0 в php?
Я не эксперт в PHP. Я знаю, что часовые пояса поддерживает в PHP.
для заданного часового пояса TZ, поддерживаемого PHP, мне нужно получить смещение (т. е. количество часов и минут для добавления или вычитания) до известного UTC (т. е. GMT+0), чтобы получить это время в зоне TZ.
Как я могу этого достичь? В конечном счете, мне нужно получить эти смещения для всех поддерживаемых часовых поясов в PHP. Спасибо.
5 ответов
Это простой пример, как получить смещение часового пояса в секундах:
$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);
это будет полезно для преобразования значений смещения в формат 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');
это даст вам стандартное смещение (не одно на или из 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
Вы можете взглянуть на различия здесь.
это возможно только по следующей одной строке.
echo (new DateTime('now', new DateTimeZone( 'Asia/Kabul' )))->format('P');
для всех поддерживаемых часовых поясов в 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);