Вот что у меня так далеко:
/**
* Parse a duration between 2 date/times in seconds
* and to convert that duration into a formatted string
*
* @param integer $time_start start time in seconds
* @param integer $time_end end time in seconds
* @param string $format like the php strftime formatting uses %y %m %w %d %h or %i.
* @param boolean $chop chop off sections that have 0 values
*/
public static function FormatDateDiff($time_start = 0, $time_end = 0, $format = "%s", $chop = false) {
if($time_start > $time_end) list($time_start, $time_end) = array($time_end, $time_start);
list($year_start,$month_start,$day_start) = explode('-',date('Y-m-d',$time_start));
list($year_end,$month_end,$day_end) = explode('-',date('Y-m-d',$time_end));
$years = $year_end - $year_start;
$months = $month_end - $month_start;
$days = $day_start - $day_end;
$weeks = 0;
$hours = 0;
$mins = 0;
$secs = 0;
if(mktime(0,0,0,$month_end,$day_end) < mktime(0,0,0,$month_start,$day_start)) {
$years -= 1;
}
if($days < 0) {
$months -= 1;
$days += 30; // this is an approximation...not sure how to figure this out
}
if($months < 0) $months += 12;
if(strpos($format, '%y')===false) {
$months += $years * 12;
}
if(strpos($format, '%w')!==false) {
$weeks = floor($days/7);
$days %= 7;
}
echo date('Y-m-d',$time_start).' to '.date('Y-m-d',$time_end).": {$years}y {$months}m {$weeks}w {$days}d<br/>";
}
(не полностью и неточно)
Я не могу понять математику правильно. Наивное разделение не будет работать из-за високосных лет и разной продолжительности месяцев.
Логика также должна меняться в зависимости от формата строки. Например, при передаче с 04 февраля 2010 года по 28 июня 2011 года (как метки времени Unix) со строкой формата %y year %m month %d day
должно получиться 1 year 4 month 24 day
, но если %y year
опущено, то необходимо добавить 12 месяцев к месяцу, т.е. , вывод должен быть 16 month 24 day
.
Должен также справиться со временем ... но я еще не дошел до этого.
Ни одно из этих date_diff решений не обрабатывает недели . И я не знаю, как я мог взломать это в date_diff
, так что это не совсем решение для меня.
Более того, $diff->format
не делает то, что я просил ... давать общее количество месяцев и дней, если "большие единицы" опущены. Пример: * 1 027 *
>>> $start = new DateTime('04-Feb-2010')
>>> $end = new DateTime('28-Jun-2011')
>>> $diff = $start->diff($end)
>>> $diff->format('%m months, %d days')
'4 months, 24 days'
Должно быть 16 months, 24 days
, как я уже говорил ранее. Пожалуйста, перестань так быстро закрывать мой вопрос, как обман, прежде чем ты поймешь его полностью. Если решения других вопросов могут быть изменены для решения этой проблемы, хорошо, но, пожалуйста, объясните, как, потому что я не понимаю.
Чтобы было ясно,
- , если
%y
опущено, годы должны быть свернуты в месяцах
- если
%m
опущено, месяцы должны быть свернуты в дни
- если
%w
опущено, недели должны быть свернуты в дни
- , если
%h
опущено, часы должны быть свернуты в минуты
- , если
%m
опущено, минуты должны быть переведены в секунды
Если "меньшие единицы" опущены, следующая самая большая единица может быть округлена или расставлена по полу, где это имеет смысл.