如何计算两天之间作为格式化字符串的差异?

mpe*_*pen 5 php date date-math

这是我到目前为止所得到的:

/**
 * 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/>";
}
Run Code Online (Sandbox Code Playgroud)

(这是不完整不准确的)

我似乎无法使数学正确.由于闰年和不同的月份长度,天真地将其分开是行不通的.

逻辑还需要根据格式字符串进行更改.例如,使用格式字符串传递2010年2月4日至2011年6月28日(作为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如果省略"更大单位" ,则不按我的要求行事......给出总月数和天数.例:

>>> $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'
Run Code Online (Sandbox Code Playgroud)

应该16 months, 24 days如我前面所说的那样.在你完全理解它之前,请不要这么快就把我的问题作为一个骗局来解决.如果可以调整其他问题的解决方案来解决这个问题,那很好,但请解释一下,因为我没有得到它.

要清楚,

  • 如果%y省略,则应在几个月内滚动年份
  • 如果%m省略,则应将月份归入日期
  • 如果%w省略,则应将周数卷入日期
  • 如果%h省略,则应将小时数分为几分钟
  • 如果%m省略,则应将分钟滚动到秒

如果省略"较小单位",则下一个最大的单位可以在有意义的地方进行舍入或平铺.

dre*_*010 1

我不期望得到一个被接受的答案,但这里是如何让 date_diff 做几周。

<?php

$january = new DateTime('2010-01-01');
$february = new DateTime('2011-02-20 3:35:28');
$interval = $february->diff($january);

$parts = $interval->format('%y %m %d %h %i %s %a');

$weeks = 0;
list($years, $months, $days, $hours, $minutes, $seconds, $total_days) = explode(' ', $parts);

if ($days >= 7) {
    $weeks = (int)($days / 7);
    $days  %= 7;
}

echo "$years years, $months months, $weeks weeks, $days days, $hours hours, $minutes minutes $seconds seconds";
// 1 years, 1 months, 2 weeks, 5 days, 3 hours, 35 minutes 28 seconds
Run Code Online (Sandbox Code Playgroud)

也许您可以将其集成到您的函数中以进行滚动并处理用户给定的格式。

如果没有给出较大的单位,您可以从最大的单位开始,然后将它们应用到下一个较小的单位。(即 1 年 1 月,如果没有年份,则月份应加 12)。如果格式中不包含“月”,则您可以使用总天数来处理月份具有不同天数的事实。