如何以人类可读的格式表达两个日期之间的差异

时间:2011-07-01 02:07:35

标签: php

如果我有两个日期 - $end_date$start_date,我如何以“2年:4个月:2天”等格式表达两者之间的差异?

我知道我可以像这样得到两个日期之间的区别:

$dif=strtotime($end_date)-strtotime($today);

但是如何将该结果转换为人类可读的格式,如上所示?

3 个答案:

答案 0 :(得分:2)

这是格式化时间戳的方法:

echo date('d-m-Y', strtotime($end_date)) // for DD-MM-YYYY format

您是否希望计算2个日期之间的差异,以天数计算?

编辑:在“XXyear YYmonth ZZday”中查找日期之间差异的代码。该代码假定开始和结束日期为YYYY-MM-DD格式。如果您不是这种情况,请将其更改为YYYY-MM-DD格式,或相应地将参数更改为mktime()。

$endDate = '2011-03-01';
$startDate = '2011-02-02';
$daysPerYear = 365;
$daysPerMonth = 30.4;
$diffDay = $diffMonth = $diffYear = 0;

$endDateTs = mktime(0, 0, 0, substr($endDate, 5, 2), substr($endDate, 8, 2), substr($endDate, 0, 4));
$startDateTs = mktime(0, 0, 0, substr($startDate, 5, 2), substr($startDate, 8, 2), substr($startDate, 0, 4));
$diffDay = ($endDateTs - $startDateTs) / 60 / 60/ 24;   // difference between 2 dates in number of days
$diffYear = floor($diffDay / $daysPerYear); // difference in years
$diffDay = $diffDay % $daysPerYear; // balance days
$diffMonth = floor($diffDay / $daysPerMonth);   // difference in months
$diffDay = ceil($diffDay % $daysPerMonth); // balance days
echo ($diffYear ? $diffYear . 'year ' : '') . ($diffMonth ? $diffMonth . 'month ' : '') . ($diffDay ? $diffDay . 'day' : '');

注意:我没有测试所有可能日期组合的代码,包括闰年等。请随时根据需要进行调整。

希望这有帮助。

答案 1 :(得分:1)

如果粗略差异足够(“2年前”),那么您可能想尝试Date_HumanDiff PEAR包。

答案 2 :(得分:0)

function is_leap_year($year)
{
    if($year % 4 == 0)
    {
        if($year % 100 == 0)
        {
            if($year % 400 == 0)
            {
                return true;
            }
            else 
            {
                return false;
            }
        }
        else
        {
            return true;
        }
    }
    else 
    {
        return false;
    }
}

function calculate_date($now, $end){
    $years = date('Y', strtotime($end)) - date('Y', strtotime($now)) ;
    if($years < 0)
    {
        return "Error: year";
    }
    $mounths = date('m', strtotime($end)) - date('m', strtotime($now)) ;
    if($mounths < 0)
    {
        if($years < 1)
        {
            return "Error: mounth and year";
        }
        else 
        {
            $years --;
            $mounths += 12;
        }
    }
    $days = date('d', strtotime($end)) - date('d', strtotime($now)) ;
    if($days < 0){
        if($mounths < 1)
        {
            if($years < 1)
            {
                return "Error: day, mounth and year";
            }
            else 
            {
                $years --;
                $mounths += 12;
            }
        }
        else 
        {
            $mounths --;
            switch (date('m', strtotime($now)))
            {
                case 1:
                case 3:
                case 5:
                case 7:
                case 8:
                case 10:
                case 12:
                    $days +=31;
                    break;
                case 4:
                case 6:
                case 9:
                case 11:
                    $days +=30;
                    break;
                case 2:
                    if(is_leap_year(date('Y', strtotime($now))))
                    {
                        $days += 29;
                        break;
                    }
                    else
                    {
                        $days += 28;
                        break;
                    }
            }
        }
    }
    return  $years . " Years : " . $mounths . " Months : " . $days . " Days Remaining.";
}

$end_date = new DateTime('2011-08-05');
$end_date = $end_date->format('d-m-Y');
$today = date('d-m-Y');

$remaining = calculate_date($today, $end_date);

echo $remaining;

如果你想格式化end_date,你可以使用: 日期('d-m-Y',strtotime($ end_date)) 之后,您可以使用calculate_date计算剩余时间。