2016-05-10 12 views
1

strtotime("2016-05-06 15:00:00 +15.98 hours")に電話すると2016-05-07 06:58:48と表示されますが、代わりに2016-05-10 02:00:00と表示されます。何がありますか?PHP strtotimeはなぜYYYY-MM-DD HH:MM:SS + 15時間を使用して間違った日を与えますか?

あなたがここにあなた自身をテストすることができます。

  1. 使用のstrtotime:http://php.fnlist.com/date_time/strtotime
  2. タイムスタンプに出力int型に変換:http://www.epochconverter.com/
+1

ようですが、整数のみを受け入れる可能性がある2つの別々の変数に時間を追加され、例えば'15 .98 'の代わりに' 16 ' –

+1

おそらく+15をタイムゾーンオフセットとして解釈します。このような複雑な文を解析する 'strtotime'に頼らないでください。それは魔法ではなく、毎回正しいものを得ることはできません。 – deceze

+2

注意: 'gmdate( 'Ymd H:i:s'、strtotime( '+ 1.5 hours'、0));は' 1969-12-31 22:00:00'になります。 2時間とする)、ここでは直感的ではない構文解析が行われていることは間違いありません。 – ceejayoz

答えて

3

を代わりにこれを試してみてください:

//60 * 60 * 15.98 = 57,528 seconds 
$add = round(60 * 60 * 15.98); 

$timestamp = strtotime("2016-05-06 15:00:00") + $add; 

$dt = date("Y-m-d H:i:s", $timestamp); 

echo $dt; //2016-05-07 06:58:48 

をこれは計算します〜2016-05-07 06:58:48

15.98時間が間違って追加された理由はより複雑です。現在、浮動小数点数はPHPの日付書式ではサポートされていませんが、PHPによるこの問題のバグが報告されています。あなたが直接日付フォーマットにフロートを使用することはできませんので、あなたは「18ヶ月」と「1.5年」のようなものに置き換え、または前にこのようなことを丸める算術演算を行う必要があります。

//60 * 60 * 15.98 = 57,528 seconds 
$timeToAdd = round(60 * 60 * 15.98); 

そして同様に)(のstrtotimeを呼び出します上記の例では

$date = strtotime("2016-05-06 15:00:00") + $timeToAdd; 
+0

これは本当にそれを回避する方法ですが、私が考える理由は*興味深い質問です。私はdownvoteしなかった。 – ceejayoz

+0

@ceejayoz私は解決策を出そうとしていましたが、それは奇妙な出来事であり、予想外の結果でした。私はそれがなぜ起こったのかについてあまりにも多くのアイデアを持っていません。たぶんそれは浮動小数点で、intとは関係ないからです。 –

3

フロートは、PHP

をフォーマット日付でサポートされていないあなたがのstrtotimeという方法で、追加を行うことができないようです。また、小数点のためのバグはあなたが何ができるかhere

を報告されているだけでウィリアムの答え

+0

同じバグを見ていて、それを投稿しようとしていました。 **浮動小数点数は、PHPで日付書式設定**で動作しないと言うのは公正だと思います。 –

関連する問題