【发布时间】:2011-09-29 17:41:13
【问题描述】:
$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 导致它延迟了一个小时。但是,我需要计算日历月的差异;是否有另一个类/函数可以做到这一点?
添加了一些修复:
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') 实际上并没有做任何事情。不知道为什么它没有出错。
【问题讨论】:
-
可能是 5 个月 29 天或其他时间 - 尝试输出包括天数在内的完整期间(
%m只为您提供完整日期的月份部分) -
加油马克。有了 15k,你不应该这么快就扔掉 bug 这个词。
var_dump($diff);看看 Pekka 提到了什么。 -
嗯,你说的都是 5 个月,29 天,23 小时(我猜是夏令时)是正确的,但这并不是重点。如果一个人查看这两个日期,他会认为它们相隔 6 个月,因为它们相差 6 个日历月。这就是我需要的答案。
-
那么
DateDiff::format可能不适合您 - 也许您需要查看一个“漂亮的日期”库,该库以对人类有意义的方式汇总句点。 -
我得到 6 个月的精确度。好奇。