日期之间的间隔包括小时php

时间:2015-11-21 03:53:30

标签: php datetime intervals

我想查找日期之间的间隔,小时功能在时间变化前一小时不能正常工作。我知道答案部分回答了这个问题here。但它根据时间没有回答。

我有以下php代码:

//helper function to pluralize words
function pluralize( $count, $text ){ 
    return $count . ( ( $count == 1 ) ? ( " $text" ) : ( " ${text}s" ) );
}

/**
 * Difference of dates
 * @param type $date1 DateTime first date
 * @param type $date2 DateTime second date
 * @return type string year, month, day, hour, minute, second 
 */
function timeDiff($date1, $date2 ){
    $string = "";  
    $interval =$date1->diff($date2);
    $suffix = ( $interval->invert ? ' ago' : '' );
    if ( $v = $interval->y >= 1 ) $string .= pluralize( $interval->y, 'year' ). ', ';
    if ( $v = $interval->m >= 1 ) $string .= pluralize( $interval->m, 'month' ). ', ';
    if ( $v = $interval->d >= 1 ) $string .= pluralize( $interval->d, 'day' ). ', ';
    if ( $v = $interval->h >= 1 ) $string .= pluralize( ($interval->h), 'hour' ) . ', ';
    if ( $v = $interval->i >= 1 ) $string .= pluralize( $interval->i, 'minute' ). ', ';
    if ( $v = $interval->i >= 1 ) $string .= pluralize( $interval->s, 'second' ). ' ';
    return $string . $suffix;
}

我想要通过以下测试。

$date1 = new DateTime("2014-05-10 20:00:00");
$date2 = new DateTime("2015-11-20 19:45:00");

//This should produce "1 year, 6 months, 9 days, 23 hours, 45 minutes"
//But it does produce "1 year, 6 months, 10 days, 45 minutes"
timeDiff($date1, $date2); 

$date3 = new DateTime("2015-11-20 20:00:00");

//This should, and does produce "1 year, 6 months, 10 days"
timeDiff($date1, $date3); 

这似乎是@John Conde在评论中指出的version issue。它已在新版本的PHP 5.4.24中修复。如何解决以前版本的PHP?

1 个答案:

答案 0 :(得分:1)

我猜您的要求是显示当地时间内表示的两个DateTime数据项之间的已过去时间。 (如果这不是您的要求,请更新您的问题。)

我还猜测你的DateTime项目是在本地时区正确创建的。您可以使用date_default_timezone_get()检查本地时区设置,并将其设置为date_default_timezone_set('Australia/Sydney')

操作服务器的人可能错误地设置了服务器默认时区,或者它位于您的其他时区。它也可能设置为UTC(也称为Zulu或Z时间,以前称为格林威治标准时间或GMT)。在这种情况下,您需要在程序中明确设置本地时区。

正确设置时区后,请创建DateTime项目。然后将两个DateTime项目转换为UTC。然后计算差异。这样的事情应该可以解决问题。

 $utczone = new DateTimeZone('UTC');
 timeDiff($date1->setTimezone($utczone), $date2->setTimezone($utczone));