0
$time_start = mktime(12,0,0,1,1,2011);
$time_end = mktime(12,0,0,7,1,2011);
$format = '%m months';

$start_date = new DateTime(date(DATE_ATOM,$time_start));
$end_date = new DateTime(date(DATE_ATOM,$time_end));
$diff = $start_date->diff($end_date, true);
echo $diff->format($format);

「5 か月」と出力されますが、これは DST のために 1 時間ずれているためだと思います。ただし、暦月の差を計算する必要があります。これを行う別のクラス/関数はありますか?


いくつかの修正を追加しました:

if($time_start > $time_end) list($time_start, $time_end) = array($time_end, $time_start);
$time_end += (date('I',$time_end)-date('I',$time_start))*3600; // correct for DST
$start_date = new DateTime(date(DATE_ATOM,$time_start));
$end_date = new DateTime(date(DATE_ATOM,$time_end));
$start_date->modify('12pm'); // ignore time difference
$end_date->modify('12pm');
$diff = $start_date->diff($end_date);
echo $diff->format($format);

これは私が望む結果をもたらすようですが、まだ完全にはテストしていません。


Herbert の提案に基づくその他の修正:

if($time_start > $time_end) list($time_start, $time_end) = array($time_end, $time_start);
$start_date = new DateTime();
$end_date = new DateTime();
$start_date->setTimestamp($time_start);
$end_date->setTimestamp($time_end);
$diff = $start_date->diff($end_date);
$hours = $diff->format('%h');
$mins = $diff->format('%i');
$secs = $diff->format('%s');
$start_date->setTime(12,0,0);//ignore time difference for date calculations
$end_date->setTime(12,0,0);
$diff = $start_date->diff($end_date);
$years = $diff->format('%y');
$months = $diff->format('%m');
$weeks = $diff->format('%w');
$days = $diff->format('%d');

$start_date->modify('12pm')は実際には何もしていないことに注意してください。なぜエラーにならなかったのか不明です。

4

1 に答える 1

2

アップデート

多くの異なるアイデアをいじった後、タイムスタンプがGMT(UTC)であることに気づきました。date(DATE_ATOM,$time_start)デフォルトのタイムゾーンを適用しています。ただし、タイムスタンプを明示的に設定DateTimeすると、UTCが想定されるため、DSTの問題は発生しません。

次のコードは、タイムゾーンやDSTに関係なく機能するようです。

<?php

$time_start = mktime(12,0,0,1,1,2011);
$time_end = mktime(12,0,0,7,1,2011)

$start_date = new DateTime();
$end_date = new DateTime();

$start_date->setTimestamp($time_start);
$end_date->setTimestamp($time_end);

$diff = $start_date->diff($end_date);

$format = '%m months';
echo $diff->format($format);

?>

日付と時刻の両方、およびさまざまなタイムゾーンのいくつかのエッジケースをテストしましたが、すべての可能性をテストしたわけではないため、問題が発生した場合は、それについて聞いてみたいと思います。

于 2011-09-29T18:48:08.320 に答える