あなたはdate
とstrtotime
などの機能を使用する場合、PHPは、PHPでのごdate.timezone
の構成に応じて、ユーザーが指定する入力を変換し、 UTCではない可能性があります。したがって、変換を行う前に、タイムゾーンを確認するか、明示的に設定することが重要です。
$date = "30 Aug 2016 1:00 pm";
date_default_timezone_set("UTC");
var_dump(date_default_timezone_get()); // gives us "UTC"
var_dump(date("Y-m-d H:i:s", strtotime($date))); // 2016-08-30 13:00:00
var_dump(date("Y-m-d H:i:s", strtotime($date . "+5:30"))); // 2016-08-30 07:30:00
ここで、なぜ5時間30分後に戻ったのか不思議です。さて、実際のUnixタイムスタンプをstrtotime
から見ると、date
とstrtotime
が何をしているのかについて真実が明らかになります。
var_dump(strtotime("30 Aug 2016 1:00 pm"), strtotime("30 Aug 2016 1:00 pm +5:30"));
これはあなたに与える...最初のケースで
int(1472562000)
int(1472542200)
、strtotime
は、入力文字列"30 Aug 2016 1:00 pm"
を取り、我々はUTCで現在しているという仮定の下でUnixタイムスタンプに変換します。 2番目のケースでは、すでに入力文字列"30 Aug 2016 1:00 pm +5:30"
が使用されていますが、これはすでにGMTオフセットが+5:30です。したがって、GMT + 0530の午後1時であると仮定し、それをUTC(i。それは今あなたがDateTime
を使用するときに、明示的にタイムゾーンまたは指定することができますので、それはすべてのこの混乱を避けるために簡単です、あなたに"30 Aug 2016 7:30 am"
を与える、UTCに到達するために5時間30分を減算する必要があるという意味E 0000)、 GMTオフセットであり、暗黙のタイムゾーン変換の対象にはなりません。また、PHPでは、タイムゾーンは単なるGMTオフセット以上のものであることに注意することが重要です。 PHPはOlson Timezone Databaseを使用して、GMTオフセットが異なるタイムゾーンで実際に異なる可能性があるため、異なるタイムゾーン間で日付/時刻情報を確実かつ正確に変換します。
// DateTime doesn't try to convert this because you told it what the timezone is
$dt = new DateTime("30 Aug 2016 1:00 pm", new DateTimezone("UTC"));
// now lets try with the offset
$dt->setTimezone(new DateTimezone("Asia/Kolkata"));
var_dump($dt->format("j M Y g:i a")); // "30 Aug 2016 6:30 pm"
実際には、加算/減算する時間数を分ける必要はありません。 PHPは、データベース内の必要なタイムゾーン情報を調べることで、すべてを把握しています。供給されたタイムゾーンと変換されたタイムゾーンを正確に指定したので、タイムゾーン間で何回変換したかにかかわらず、正確な時刻を常に保つことができます。それはあなたがしようとしているものよりはるかに信頼性の高い抽象です。
strtotimeはStringparserであるため、ときどき奇妙な動作をします。日付ではなくタイムスタンプで計算するか、DateTimeを使用することをお勧めします。 DateTimeでは、タイムゾーンを変更して結果を得ることができます。 –