关于日期 - 时间差异的月份和年份

问题描述:

我已经制定了一个函数来计算两个日期时间之间的年龄,但我在月份和年份有问题,因为月份可能是29,30,或31天。关于日期 - 时间差异的月份和年份

我很困惑,这是否会导致任何问题?如果是,那么有人可能会提出解决方案。

这里是我的功能

function time_age($date_time1,$date_time2 = ''){ 
    //store current date-time if it hasn't been given 
    if (empty($date_time2)){ 
     $date_time2 = date('Y-m-d H:i:s'); 
    } 
    //get date-time difference in seconds 
    $time_age = strtotime($date_time2) - strtotime($date_time1); 
    //to store if seconds, minutes, hours, days, weeks, months, years 
    $time_age_type = 'seconds'; 
    if ($time_age >= 60 and $time_age < 3600){ 
     $time_age_type = 'minutes'; 
     $time_age = number_format($time_age/60, 0); 
    }elseif ($time_age >= 3600 and $time_age < 86400){ 
     $time_age_type = 'hours'; 
     $time_age = number_format($time_age/3600, 0); 
    }elseif ($time_age >= 86400 and $time_age < 604800){ 
     $time_age_type = 'days'; 
     $time_age = number_format($time_age/86400, 0); 
    }elseif ($time_age >= 604800 and $time_age < 2629743){ 
     $time_age_type = 'weeks'; 
     $time_age = number_format($time_age/604800, 0); 
    }elseif ($time_age >= 2629743 and $time_age < 31556926){ 
     $time_age_type = 'months'; 
     $time_age = number_format($time_age/2629743, 0); 
    }elseif ($time_age >= 31556926){ 
     $time_age_type = 'years'; 
     $time_age = number_format($time_age/31556926, 0); 
    } 
    return $time_age.' '.$time_age_type.' ago'; 
} 

我会建议这个替代的解决方案,所以我把这个例子从https://php.net

<?php 
$val1 = '2014-03-18 10:34:09.939'; 
$val2 = 'now'; 

$datetime1 = new DateTime($val1); 
$datetime2 = new DateTime($val2); 
echo "<pre>"; 
var_dump($datetime1->diff($datetime2)); 

https://secure.php.net/manual/en/datetime.diff.php#114656

怎么样这个功能是我使用什么?

/** 
* Get a string of length of time elapsed since a specified time. 
* 
* @param int $time the specified time to check 
* @return string returns a string stating the length of time ago. 
*/ 
function timeSince($time) 
{ 
    $timeDifference = time() - $time; 

    $timeTokens = [ 
     31536000 => 'year', 
     2592000 => 'month', 
     604800 => 'week', 
     86400 => 'day', 
     3600 => 'hour', 
     60 => 'min', 
     1 => 'sec' 
    ]; 

    foreach ($timeTokens as $unit => $text) { 
     if ($timeDifference < $unit) continue; 

     $noUnits = floor($timeDifference/$unit); 

     return $noUnits . " " . $text . (($noUnits > 1) ? "s ago" : " ago"); 
    } 
} 

使用

echo timeSince(time() - 86400); 

输出

1 day ago 

您还可以使用DateTime类的diff功能:

OO方法:

$datetime1 = new DateTime('2009-10-11'); 
$datetime2 = new DateTime('2009-10-13'); 
$interval = $datetime1->diff($datetime2); 

echo $interval->format('%R%a days'); 

一个程序方法:

$datetime1 = date_create('2009-10-11'); 
$datetime2 = date_create('2009-10-13'); 
$interval = date_diff($datetime1, $datetime2); 

echo $interval->format('%R%a days'); 

注:如果使用DateTime类,并希望找到两个之间的区别UNIX时间戳,那么您必须在时间戳之前放置一个@符号,例如:

new DateTime("@" . $yourUnixTimestamp); 

否则会引发错误。