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


How to express the difference between two dates in a human-readable format

如果我有两个日期-$end_date$start_date,我如何用"2年:4个月:2天"之类的格式来表示两者之间的差异?

我知道我可以这样得到两个日期之间的差异:

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

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

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

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

你想计算两个日期之间的差异吗?

编辑:用代码查找"XX年YYY月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' : '');

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

希望这能有所帮助。

如果粗略的差异就足够了("2年前"),那么您可能需要尝试Date_HumanDiff PEAR包。

实现这一点的干净、DRY、专业、现代的方法是创建两个日期时间对象并调用diff()。生成的diff对象将自动为您填充年、月、日的值。

然后,您只需要遍历一个包含所需单元的查找数组,并将任何非零结果内爆到纯英文输出字符串中。

代码(演示)

$startDate = '2001-04-20';
$endDate = '2015-11-29';
$diff = (new DateTime($startDate))->diff(new DateTime($endDate));
$lookup = [
    'y' => 'Year',
    'm' => 'Month',
    'd' => 'Day',
];
$elements = [];
foreach ($lookup as $property => $word) {
    if ($diff->$property) {
        $elements[] = "{$diff->$property} $word" . ($diff->$property !== 1 ? 's' : '');
    }
}
echo implode(' : ', $elements);
// 14 Years : 7 Months : 9 Days
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计算剩余时间。