2回の差を計算してきれいに印刷したいです。差が24時間を超えることはないので、次のことを試してみました
$time = 7200; //time difference in seconds
date("H:i:s", $time); // should print 02:00
結果は予期しないものであり、代わりに03:00を出力します。
私は何が間違っているのですか?
なぜDateTime::diffではないのですか?
ここで、PHP.netでDateTimeクラスを確認してください
php.net datetime diffページから取得:
$datetime1 = new DateTime('2009-10-11');
$datetime2 = new DateTime('2009-10-13');
$interval = $datetime1->diff($datetime2);
echo $interval->format('%R%a days');
//Outputs +2 days
date
時間差の計算に使用しないでください。まず、それは醜いハックです。それはその目的のために意図されていませんでした。次に、タイムゾーンがUTCに設定されている場合にのみ確実に機能します。
さて、なぜそれが機能しないのか:PHP関数の日付は2つの引数を取りformat
、timestamp
後者は1970年1月1日00:00UTCからの秒数として定義されます。unixエポックと呼ばれます。したがって、date( "H:i"、3600)を呼び出し、タイムゾーンがUTCに設定されている場合、 "01:00"が返されます。これは、UNIXエポックから1時間後の時刻であり、エポックが深夜であったためです。
問題は、UNIXエポックがUTCの深夜にのみ発生し、他のタイムゾーンには存在しなかったことです。そして、これが誤った結果の原因です。
PHPdate()
関数は、時差(「3時間5分前」など)ではなく、絶対タイムスタンプ(「2012年7月20日金曜日、15:02 UTC」など)をフォーマットするためのものです。
場合によっては、タイムゾーンをUTCに設定し、UnixエポックがUTCの深夜に発生するという事実に依存することで、正しくフォーマットされた時差のように見えるものを作成するように仕向けることができます。date()
ただし、それでも、これは24時間未満の正の時間差に対してのみ機能します。
代わりに、正しい解決策は、時差をフォーマットするために設計された関数を使用するか、自分で作成することです。これを行うための簡単な関数は次のとおりです。
function format_time_difference ( $delta ) {
$sign = ( $delta < 0 ? "-" : "" );
$delta = abs( $delta );
return sprintf( "%s%02d:%02d:%02d", $sign, $delta / 3600,
($delta / 60) % 60, $delta % 60 );
}
もちろん、必要に応じて、この関数を拡張して、出力に日数を含めることもできます。