2017-07-28 16 views
1

私は時間とともに多くの計算を行う必要のあるアプリケーションに取り組んできました。私が理解できるように、これはGMTの日付を返すことになっている、gmdateはサーバー間で一定ではありませんか?

$dateToday = strtotime(gmdate("m/d/y")); 

作業のすべてを維持するためにになって、私が始まりました。だから、サーバが入っている時間帯に関係なく、私は同じ時間を取るべきですか?

私はlocalhost上で開発したので、すべてがスムーズに動作しましたが、別のタイムゾーンでサーバーに移動したときに問題が発生しました。

localhostの "$ dateToday"をエコーすると "1501192800"、私は "1501214400"というサーバで同じことをします。 これは、ローカルマシンとサーバーの6時間の時間差と同じです。

ここで私は何が欠けていますか?私が理解できるように

おかげ

+0

Use DateTime(http://php.net/manual/en/class.datetime.php) – Neodan

+1

*「ここで私は何が欠けていますか?」 - タイムゾーンが何であるかをよく読んで理解する時間計算やPHP [日付/時刻関数](http://php.net/manual/en/ref.datetime.php)の知識にも影響します。私はそれらについて読むことをお勧めしますが、それらを使用しないでください。代わりに、['DateTime'](http://php.net/manual/en/class.datetime.php)と関連するクラスを使用してください。それらは使いやすく、タイムゾーンの完全なサポートを提供します(古い日付/時刻関数はそうではありません)。 – axiac

+0

サンプル:date_default_timezone_set( 'Europe/Berlin'); –

答えて

2
$dateToday = strtotime(gmdate("m/d/y")); 

が、これは、GMTの日付を返すことになっています。

全くありません。

gmdate()は、GMTタイムゾーンを使用して日付をフォーマットします。 1つの引数で呼び出すので、time()を呼び出すことによってフォーマットする日付を取得します。

time()は、現在のタイムスタンプ、つまりJan 1, 1970, 0:00:00 UTCから経過した秒数を返します。

次に、gmdate()は、最初の引数で指定した形式を使用して、2番目の引数(現在のタイムスタンプ)を表示します。 gmdate("m/d/Y")によって返される値は07/28/2017です。

07/28/2017は、それを日付と解釈しようとするstrtotime()に渡され、そこからタイムスタンプが計算されます。時間構成要素が含まれていないため、strtotime()は時刻が0:00:00であるとみなします。

ここにキャッチが来ます。提供された文字列にはタイムゾーン情報も含まれていないため、PHPはその設定を使用してタイムゾーンを想定します。すでに発見したように、2つのサーバーでコードを実行すると、構成が異なるため異なる結果が生じる可能性があります。私にとって

strtotime(gmdate('m/d/Y'))戻り1501200000、これは(私がテストに使用されるPHPはそのdefault timezoneとして「UTC」を使用しているため)は本日(July 18, 2017)はUTCタイムゾーンで開始タイムスタンプ(時間のモーメント)です。異なるサーバーで取得した値は、今日のそれぞれのタイムゾーンで開始された時刻です。

私のタイムゾーン(Europe/Bucharest)に正しく設定されたPHPで同じコードを実行すると、1501189200が得られます。現在がUTC+3(東ヨーロッパ標準時の標準+2 +夏時間のため1時間)になっているため、UTCで使用する値よりも前には10800秒です。

PHPは現在、DateTimeとその名前がDateで始まる他のクラス(ドキュメントで見つける)の日付と時刻を処理するクラスを提供しています。古いdate & time functionsより使いやすく、タイムゾーンの処理方法も知っています(古い関数はわかりません)。あなたにも(希望の時間帯に)「今」のためDateTimeオブジェクトを作成して設定することができます

$dateToday = new DateTime("today 0:00:00", new DateTimeZone("UTC")); 

:UTCタイムゾーンに今日の開始を格納DateTimeオブジェクトを作成

はほど簡単です0:00:00への時間:コードで変更されていないDateTimeオブジェクトに対して

$dateToday = new DateTime("now", new DateTimeZone("UTC")); 
$dateToday->setTime(0, 0, 0); 

(彼らは読み取り専用されている)、あなたがより良いDateTimeImmutableオブジェクトを作成します。このクラスは、格納している値の偶発的な変更を防ぎます。

+0

ありがとうございました $ dateToday = new DateTime( "今日は0:00:00"、新しいDateTimeZone( "UTC")); $ dateGMTUnixToday = $ dateToday-> format( 'U'); となり、1501200000という定数が得られました。 詳細な説明を本当にありがとうございます。 – VoidZA

+0

@VoidZAあなたが答えに感謝したら、それをupvoteしてください。それが本当にそれを受け入れるのを助けたら – RiggsFolly

+0

私はupvoteに十分な担当者がいない、どちらかの "受け入れる"ボタンが表示されません。 – VoidZA

関連する問題