2016-06-23 7 views
3

私は小枝とUnixのタイムスタンプに変換する私のMySQLデータベースからのDateTimeています。TIMESTAMPとして小枝で2016-06-22 00:00:00間違ったタイムスタンプ/タイムゾーン変換

::DB

dbEntry.start|date('U') == >1466546400日として小枝で

dbEntry.start|date('Y-m-d H:i) ==>2016-06-22 00:00

ここでタイムスタンプをダブルチェックするhttp://www.gaijin.at/olsutc.phpは、タイムスタンプは現地時間であると言います。

私はこの問題が発生した私のバックエンドにAjaxCall経由でこのタイムスタンプを送信します

すべての私php.ini
$dateDB = \DateTime::createFromFormat('U',$date)->format('Y-m-d H:i'); 
dump($dateDB); 

$date1466546400ある)

出力

2016-06-21 22:00

ファイル私はタイムゾーンをEurope/Berlinですが、結果のタイムスタンプは明らかにUTCです。

$dateDB = \DateTime::createFromFormat('U',$date,new \DateTimeZone('Europe/Berlin'))->format('Y-m-d H:i'); 
    dump($dateDB); 

で手動でタイムゾーンを設定することも、2016-06-21 22:00につながります。

php.iniファイルのほかに、どうやってこのファイルが検索されますか?

私は、これはここにもアドレスPHP timestamps & timezone configurationされていることがわかり側注

、私は手動で7200秒を追加することができますが、それはまだ原因DailightSavingTimeに冬で正しいでしょうか?

+0

DBのタイムゾーンとローカルタイムゾーンが異なると思います。 –

+0

DBの日付が正しいと仮定して、デフォルトのタイムゾーンをphp.iniのEurope/Berlinに設定するべきではありませんか? 'format'を実行すると、デフォルトのタイムゾーンが使用されます。タイムゾーンなしでDateTimeオブジェクトを作成することは正しいです。 –

+0

私が言ったように、すべての 'php.ini'ファイル(cliとapache)にはデフォルトのタイムゾーンとして' Europe/Berlin'があります。 – PrimuS

答えて

3

問題がcreateFromFormat()が設計することにより、その第三引数(タイムゾーン)を無視しているという事実から来ている:

注:タイムゾーンパラメータと現在のタイムゾーンが 時間パラメータは無視されますUNIXタイムスタンプ(例: 946684800)を含むか、タイムゾーンを指定します(2010-01-28T15:00:00 + 02:00など)。ここで

はクリーナーテストケースです:ここで

$dt = new DateTime('2016-06-22 00:00:00', new DateTimeZone('Europe/Berlin')); 
$dt2 = DateTime::createFromFormat('U', $dt->getTimestamp(), new \DateTimeZone('Europe/Berlin')); 
var_dump($dt->format('c'), $dt2->format('c')); 
string(25) "2016-06-22T00:00:00+02:00" 
string(25) "2016-06-21T22:00:00+00:00" 

、あなたは(タイムゾーン情報が存在しない場合、デフォルトのタイムゾーンにのみ使用される)、その後タイムゾーンを変更する必要があるだろう:

$dt2->setTimeZone(new DateTimeZone('Europe/Berlin')); 
関連する問題