2016-08-30 8 views
1

タイムゾーンごとに正しい日付を取得したいと思います。strtotimeでArithmatic記号が正しく機能しない

ex。私はGMTから+5:30のタイムゾーンを持っています。 GMTが30 aug 2016 1:00 pmの場合はgmt + 5:30は2016年8月30日午後6時30分ですが、時間帯を追加すると実際にそれを減算します。

$a=date('Y-m-d H:i:s'); 

正しいGMTごとに私の2016年8月30日7時36分01秒を与える:

私はこのコードを持っています。

$b="+5:30"; 
$c=(strtotime($a.$b)); 
echo($c); 

は、それは私が2016年8月30日夜01時10分32秒を取得する必要が間違っている2016年8月30日2時08分25秒を与えます。

私が意味するのは、タイムゾーンの値を加算すると減算され、タイムゾーンとして-5:30と同じ場合、正しい結果が得られます。誰かが私が間違ってやっていることを提案してください。

+0

strtotimeはStringparserであるため、ときどき奇妙な動作をします。日付ではなくタイムスタンプで計算するか、DateTimeを使用することをお勧めします。 DateTimeでは、タイムゾーンを変更して結果を得ることができます。 –

答えて

0

使用DateTimeZoneDateTimeオブジェクトのタイムゾーンのオフセットでの作業中に、それはより明確にする:

$a = "2016-08-30 07:36:01"; 
$b = "+5:30"; 

$gmtTz = new \DateTimeZone("GMT"); 
$offset = new \DateTimeZone($b); 

$dt = new \DateTime($a, $gmtTz); 
$dt->setTimezone($offset); 

echo $dt->format("Y-m-d H:i:s"); // "016-08-30 13:06:01" 
+0

ありがとうございました!それは私が探していたものです。 –

+0

@UmeshKaushik、あなたは答えを受け入れようとしましたか? – RomanPerekhrest

0

これを試してみてください:

解決方法1:

$minutesToBeAdded = 330; 
$currentDate = date('Y-m-d H:i:s'); 

$currentTime = new DateTime($currentDate); 
$currentTime->add(new DateInterval('PT' . $minutesToBeAdded . 'M')); 

$newTime = $currentTime->format('Y-m-d H:i'); 

解決方法2:

$currentDate = date('Y-m-d H:i:s'); 
$dateTime = new DateTime($currentDate); 
$dateTime->modify('+330 minutes'); 

解決策3:

私はそれをテストしていませんが、私は上記の解決策が役に立つと思います。

+0

しかし、@RomanPerekhrestはうまく動作します。提案していただきありがとうございます。 –

0

あなたはdatestrtotimeなどの機能を使用する場合、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から見ると、datestrtotimeが何をしているのかについて真実が明らかになります。

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は、データベース内の必要なタイムゾーン情報を調べることで、すべてを把握しています。供給されたタイムゾーンと変換されたタイムゾーンを正確に指定したので、タイムゾーン間で何回変換したかにかかわらず、正確な時刻を常に保つことができます。それはあなたがしようとしているものよりはるかに信頼性の高い抽象です。

関連する問題