質問

2日間の日数を計算しようとしていますが、夏時間の問題に直面しています。これが私のコードです:

function date_diff($old_date, $new_date) {
    $offset = strtotime($new_date) - strtotime($old_date);
    return $offset/60/60/24;
}

日が両方とも同じDST期間内であれば、問題なく動作します:

echo date_diff('3/15/09', '3/18/09'); // 3

ただし、それらがさらに離れている場合ではありません:

echo date_diff('11/15/08', '3/18/09'); // 122.95833333333

偶数日が必要で、DSTは気にしません。結果を四捨五入できると思いますが、それは気味が悪いと感じます。より良い(簡単な)方法はありますか?私はそれを回避することができれば、丸一日の解析とカウント、回避、うるう年のことを書く必要はありません。

(注:これはphp 5.1.6で実行する必要があるため、5.3の日付機能の一部は利用できない場合があります。)

もう少し情報:オフセットを取得し、dbにある他の日付時刻に追加します。時間部分ではなく、日部分のみを変更します。とにかく、丸めが機能しないことがわかります。なぜなら、追加を行うと、反対方向に1時間ずれるからです。たぶん問題全体に対するより良いアプローチがあるでしょう。...

役に立ちましたか?

解決

http://ca3.php.net/date_default_timezone_set を使用してタイムゾーンを設定できますGMTなので、オフセットはありません。

または、date('I',$timetamp)

を使用して手動でオフセットを追加することもできます
if ( date("I") == 1 ) {      // "WE ARE MDT";  
        $timeZone = "MDT";  
} else {  
        $timeZone = "MST";  
}  

他のヒント

夏時間(GMT / UTC)を使用せずに、日付を強制的にタイムゾーンに合わせます:

function date_diff($old_date, $new_date) {
  $offset = strtotime($new_date . " UTC") - strtotime($old_date . " UTC");
  return $offset/60/60/24;
}

echo date_diff('3/15/09', '3/18/09'); // 3
echo date_diff('11/15/08', '3/18/09'); // 123

floor() または ceil()

上記の「UTC」コードを試しました。私には役に立たなかった。 10進数値を取得しました。

日付範囲内に夏時間がある場合、シリアルの小数部の差は.5未満またはそれ以上になります。日付範囲の夏時間が3/15になると、10進数値は<!> gtになります。 .5デイライトが日付の10進数<!> ltから消えるとき; .5。だから、私はround()関数に差分シリアルを入れて、日数に必要な整数を取得します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top