2011-07-14 4 views
1

PHPバージョン5.3.1で奇妙な結果が出ていますが、誰でも以下の結果を説明できますか?strtotime/86400が偶数の日数も返さない

$secondsDiff = strtotime(date("2011-11-10")) - strtotime('2011-07-15'); 
return ($secondsDiff/86400); 

117.958333333を返します。

日付を近い方で使用すると一般的に機能します。

私はドキュメントを見ていましたが、これに対する参照は見つかりませんでした。これは私が一緒に暮らすことを学ぶ必要がある既知のPHPのバグですか、私は何か非常に明白な行方不明ですか?

答えて

6

おそらく、DSTスイッチが原因で、期間の長さが1時間増減します。

これは、PHP 5.3の新鮮なDateInterval classで丸めたり、よりエレガントにして修正することができます。これは、ピリオドを日数以上にフォーマットすることができます。マニュアルから

盗まれた:

<?php 
$datetime1 = new DateTime('2009-10-11'); 
$datetime2 = new DateTime('2009-10-13'); 
$interval = $datetime1->diff($datetime2); 
echo $interval->format('%R%a days'); 
?> 
+0

おかげペッカのように文字列にUTCを追加! DateIntervalを使用して問題をうまく解決しました:) – Nick

1

は必ず、86400によってそれらを割ることはほとんどの時間を動作することにより、日に秒を変換しないででください、しかし、いくつかの状況で、それは醜いを返します。数。それがここで起こっていることです。通常の犯人は、夏時間に出入りするスイッチです。

遅い方法はループを使用してmktime()に電話することです。現代的な方法は、DateIntervalクラスを使用することです。

0

strtotime()関数はTZ環境変数を使用します。つまり、その日付を変換すると、タイムゾーンがGMTに設定されていない限り、真夜中ではないタイムスタンプになります。

したがって、夏時間のある地域にいる場合、11月の日付は7月の1時間になります。あなたはあなたが提供した2つの日付を使ってこれを簡単にテストすることができます。私のサーバー上では、それぞれが午前4時に現れ、もう一つはそれぞれの日に午前5時に現れます。

0

別の解決策:

$datetime1 = new DateTime('2009-10-11 UTC'); 
$datetime2 = new DateTime('2009-10-13 UTC');