2012-02-04 4 views
11

私はPHPの専門家ではありません。私はタイムゾーンがsupportedであることを知っています。GMT + 0からPHPのタイムゾーンオフセットを取得するには?

PHPでサポートされているタイムゾーンTZの場合、TZゾーンでその時間を取得するには、既知のUTC(GMT + 0)にオフセット(つまり、加算または減算する時間数)を取得する必要があります。

どうすればこの問題を解決できますか?最終的には、PHPでサポートされているすべてのタイムゾーンのオフセットを取得する必要があります。ありがとう。

+0

デフォルトのタイムゾーンを必要なだけに設定することはできませんか? – Jivings

+0

逆の操作が必要です。 – JVerstry

+0

私の一行の答えを見てください** [below](http://stackoverflow.com/a/40204648/4134066)**。 – MNR

答えて

18

これは、タイムゾーンは秒単位でオフセットを取得する方法の簡単な例です:フォーマットGMT + Xでそれを表示するために

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

:サポートされているすべてのタイムゾーンについては

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

working example

+0

@Raceimaztion **は無効な編集を承認しません**。審査は重大な責任であり、慎重な注意を払う必要があります。あなたは信頼できない順に101の編集を承認しました。 –

+1

実際の応答形式が間違っていることに注意してください。 オフセットにはGMT標準が使用されていますが、代わりにUTC標準が使用されています。 GMT(グリニッジ標準時)は夏時間の影響を受けます。つまり、夏にはGMTはUTC + 0からUTC + 1になります。 たとえば、GMT + 1またはUTC + 1のイタリアのような国は、夏時間にUTC + 2を取得します。 このコードを 'Europe/Rome'でテストしたところ、「GMT + 2」が正しくありませんでしたが、このコードでは代わりにUTC値 –

+0

@Teneffが返されます。それはいくつかのケースでもっと便利かもしれません... :) –

2

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

これは([年の時間に応じて]いないDSTのうち1 または)あなたにオフセット標準を取得します:

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 

することができます差異hereを覗いてみてください。

+0

偉大な答え。このコードには、foreach行にタイプミスがあります。これは余分な閉じ括弧です。 –

+1

実際、この答えはかなり問題です。すべての遷移を取得するのは非常に遅く、多くのメモリを消費します。単一のタイムゾーン以上でこれをやっているのなら、それはおそらく悪い考えです。より良い実装では、昨年の遷移のみを取得するかもしれません - 一度実際に意味をなさがすためのhttp://www.php.net/manual/en/datetimezone.gettransitions.phpのコメントを参照してください(これはPHP 5.3の機能ですAIUI )。 –

+0

@GeorgeLund:そうですね、私は5.2時にこれを書きましたが、気軽に更新してください。 :-) –

15

これは、任意の計算なし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'); 
+0

簡単なinbuilt APIを使用しています。甘い! –

+0

これは最高の答えです! –

3

それは以下の1本の線でだけ可能です。

echo (new DateTime('now', new DateTimeZone('Asia/Kabul')))->format('P'); 
関連する問題