2011-04-27 1 views
17

サーバー環境PHP UTC

のRedhat Enterprise Linuxの
PHP 5.3.5

問題

のは、私はUTCの日付と時刻を持っているとしましょうなど2011-04 -27 02:45と私は アメリカ/ New_Yorkです私の現地時間にそれを変換します。

3つの質問:

1)以下の私のコードは、問題を解決する可能性がありますあなたは同意するだろうか?

<?php 

date_default_timezone_set('America/New_York'); // Set timezone. 

$utc_ts = strtotime("2011-04-27 02:45"); // UTC Unix timestamp. 

// Timezone offset in seconds. The offset for timezones west of UTC is always negative, 
// and for those east of UTC is always positive. 
$offset = date("Z"); 

$local_ts = $utc_ts + $offset; // Local Unix timestamp. Add because $offset is negative. 

$local_time = date("Y-m-d g:i A", $local_ts); // Local time as yyyy-mm-dd h:m am/pm. 

echo $local_time; // 2011-04-26 10:45 PM 

?> 

2.)しかし、$ offsetの値は、夏時間(DST)に対して自動的に調整されますか?
)そうでない場合は、コードを微調整してDSTを自動的に調整する必要がありますか?

ただ、これは、これを実行した後、$ utc_tsは現地時間が含まれています:-)

+2

試しましたか? – wallyk

+0

'date(" Z ")'は、DSTの修正がないタイムゾーン 'GMT + 0000'を常に返します。 –

答えて

32

これは、あなたがPHPSにネイティブDateTimeDateTimeZoneクラスを使用してやりたいことになります。

$utc_date = DateTime::createFromFormat(
       'Y-m-d G:i', 
       '2011-04-27 02:45', 
       new DateTimeZone('UTC') 
); 

$nyc_date = $utc_date; 
$nyc_date->setTimeZone(new DateTimeZone('America/New_York')); 

echo $nyc_date->format('Y-m-d g:i A'); // output: 2011-04-26 10:45 PM 

は、より多くの情報のためDateTime::createFromFormat man pageを参照してください。

time zones that do and do not currently have DSTの間のいくつかの実験の後、私はこれがDSTを考慮に入れることを発見しました。上記の私の方法を使用して同じ変換は同じ結果の時間をレンダリングします。

+1

これは、PHPがインディアナ州の7つの異なるタイムゾーンのように、狂ったDSTルールをすべて説明している理由です:http://php.net/manual/en/timezones.php –

+0

All:皆さんの助けに本当に感謝しています。 Treffynnon:ありがとう!私はそれを試してみましょう。私のコードはあなたのものと比べてとても元気です。私は私の試みで近くでしたか?再度、感謝します! – John

+0

@ジョンあなたがそれが好きです。手続き型のPHPスタイルで書いたことがないので、あなたのコードについてはわかりません。 – Treffynnon

0
date_default_timezone_set('America/New_York'); // Set timezone. 
$utc_ts = strtotime("2011-04-27 02:45"); // UTC Unix timestamp. 

ありがとうございます。 PHPはDST自体を処理します。

= H =

+1

これはタイムゾーン間の時間を変換しません。 '2011-04-27 02:45'の新しいunixタイムスタンプを作成するだけです。この例では、例のタイムゾーンは何もせず、重要ではありません。 – Treffynnon

+2

タイムスタンプはタイムゾーンの影響を受けないため、UTCタイムスタンプのようなものはありません。最初の行に任意のタイムゾーンを設定でき、$ utc_tsは同じ値を返します。このコードは、スクリプトでの将来の使用のためにタイムゾーンを設定するだけで、タイムスタンプ自体には影響しません。 – Wh1T3h4Ck5

3

これは古い投稿ですが、正しい時間を取得するために追加する必要がある別の行があります。

ローカル時刻に変換する前に、あなたが(それはあなたが提供している時間の時間帯であれば)このようにUTCにデフォルトのタイムゾーンを設定する必要があります。

function GmtTimeToLocalTime($time) { 
    date_default_timezone_set('UTC'); 
    $new_date = new DateTime($time); 
    $new_date->setTimeZone(new DateTimeZone('America/New_York')); 
    return $new_date->format("Y-m-d h:i:s"); 
} 
0

私はHasinに改善しますHayderの答え

date_default_timezone_set('America/New_York'); // Set timezone. 
$utc_ts = strtotime("2011-04-27 02:45 UTC"); // UTC Unix timestamp. 
echo date('Y-m-d H:i:s a T', $utc_ts); 

これは、出力

2011-04-26 10:45:00 pm EDT 

違いがsを追加している必要がありますourceタイムゾーン。 strtotime()はあなたも知っているタイムゾーンを受け入れます! :p