2016-03-18 8 views
2

私はいくつかの時間関連の機能に取り組んでおり、私はいつもUTC時間を使い、一貫性のために整数としてタイムスタンプを保存します。PHP mktimeとtimezone

しかし、mktimeを使用すると、現在設定されているタイムゾーンが戻り値mktimeの影響を受けているようです。ドキュメントから、mktimeは、エポックから秒数を返すことになっていることが分かります。

与えられた引数に対応するUnixタイムスタンプを返します。 this timestampは、 のUnixエポック(1970年1月1日00:00:00 GMT)から指定された時間までの秒数を含む長い整数です。

http://php.net/manual/en/function.mktime.php

しかし、mktimeが現在設定されているタイムゾーンを含むと思われます。次のコードを使用している場合:exacly 11時間の違いのようですどの

1451606400 
1451566800 

date_default_timezone_set('UTC'); 
$time = mktime(0, 0, 0, 1, 1, 2016); 
echo "{$time}\n"; 

date_default_timezone_set('Australia/Sydney'); 
$time = mktime(0, 0, 0, 1, 1, 2016); 
echo "{$time}\n"; 

を私は2つの時間が同じになるようにバレス期待するが、どうやらそうではありません

1451606400 - 1451566800 = 39600/(60*60) = 11 

mktimeについて正しく理解していないか、mktimeを使用するとタイムゾーンが考慮されるのはなぜですか?

答えて

5

それは(それは、日付と時刻になるとPHPが私には意味をなされたことはない)である方法ですが、へ

同一である代替機能gmmktime()があり、なぜ私はあなたを伝えることはできません渡されたパラメータを除いて、mktime()はGMT日付を表します。 gmmktime()は内部的にmktime()を使用しているため、派生したローカル時刻で有効な時刻だけを使用できます。

方法mktime()gmmktime()time()作業を説明しcomment on the PHP documentation for this functionもあります。基本的には、UNIXのタイムスタンプ自体にタイムゾーンが設定されていなくても、タイムゾーンで常に考えると仮定しています。

+1

これはかなりひどいです。彼らがしなければならなかったのは、常にすべての時間機能でUTCを使用し、時間を「表示」する場合にのみタイムゾーンを組み込むことでした。私はそれがPHPの "歴史"のためにあると思います...あなたの答えをありがとう! – Luke