日期之间的间隔包括小时 php
Interval between dates including hours php
我想查找日期之间的间隔,时间更改前一小时的小时功能无法正常工作。我知道有一个答案可以部分回答这个问题 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 解决这个问题?
我猜您的要求是显示以您当地时间表示的两个 DateTime 数据项之间的 elapsed 时间。 (如果这不是您的要求,请更新您的问题)。
我还猜想您的 DateTime 项目是在当地时区正确创建的。例如,您可以使用 date_default_timezone_get()
and set it with date_default_timezone_set('Australia/Sydney')
检查本地时区设置。
可能是您服务器的操作人员错误地设置了服务器默认时区,或者它位于您所在的其他时区。它也可能设置为 UTC(也称为 Zulu 或 Z 时间,以前称为格林威治标准时间或 GMT)。在这种情况下,您需要在程序中明确设置本地时区。
正确设置时区后,创建 DateTime 项。然后将两个 DateTime 项都转换为 UTC。然后计算差值。像这样的东西应该可以解决问题。
$utczone = new DateTimeZone('UTC');
timeDiff($date1->setTimezone($utczone), $date2->setTimezone($utczone));
我想查找日期之间的间隔,时间更改前一小时的小时功能无法正常工作。我知道有一个答案可以部分回答这个问题 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 解决这个问题?
我猜您的要求是显示以您当地时间表示的两个 DateTime 数据项之间的 elapsed 时间。 (如果这不是您的要求,请更新您的问题)。
我还猜想您的 DateTime 项目是在当地时区正确创建的。例如,您可以使用 date_default_timezone_get()
and set it with date_default_timezone_set('Australia/Sydney')
检查本地时区设置。
可能是您服务器的操作人员错误地设置了服务器默认时区,或者它位于您所在的其他时区。它也可能设置为 UTC(也称为 Zulu 或 Z 时间,以前称为格林威治标准时间或 GMT)。在这种情况下,您需要在程序中明确设置本地时区。
正确设置时区后,创建 DateTime 项。然后将两个 DateTime 项都转换为 UTC。然后计算差值。像这样的东西应该可以解决问题。
$utczone = new DateTimeZone('UTC');
timeDiff($date1->setTimezone($utczone), $date2->setTimezone($utczone));