PHP自函数错误以来的时间
我正在编写一个time-since函数来返回给定mysql-datetime之后的时间。从当前时间()获取$oldtime时,当我需要一个正整数时,它返回一个负整数。我以前用其他语言编写过类似的函数,但我对这个问题视而不见,因此非常感谢您的帮助PHP自函数错误以来的时间,php,mysql,Php,Mysql,我正在编写一个time-since函数来返回给定mysql-datetime之后的时间。从当前时间()获取$oldtime时,当我需要一个正整数时,它返回一个负整数。我以前用其他语言编写过类似的函数,但我对这个问题视而不见,因此非常感谢您的帮助 function timeSince($time){ $today = date("Y"); $oldtime = strtotime($time); $time = time() - $oldtime;
function timeSince($time){
$today = date("Y");
$oldtime = strtotime($time);
$time = time() - $oldtime;
$tokens = array (
3600 => 'h',
60 => 'm',
1 => 's'
);
if($time >= 86400){
}
}
echo timeSince('2016-02-25 14:35:00');
在您的示例中,
$oldtime
的值必须小于当前的time()
因此,如果您想计算较大值之间的时间,只需颠倒您的等式:
这一行:
$time=time()-$oldtime代码>
变成:
$time=$oldtime-time()代码>在您的示例中,$oldtime
的值必须小于当前的time()
因此,如果您想计算较大值之间的时间,只需颠倒您的等式:
这一行:
$time=time()-$oldtime代码>
变成:
$time=$oldtime-time()代码>strotime
在PHP设置中使用时区。根据时区设置,它可能会转换为尚未发生的时间。例如,在我的乌克兰服务器上,strotime('2016-02-25 14:35:00')
转换为1456403700
,在另一个时区(美国/太平洋)的服务器上转换为1456439700
引自PHP文档:
该函数期望得到一个包含英文日期格式的字符串,并将尝试将该格式解析为Unix时间戳(自1970年1月1日00:00:00 UTC以来的秒数),相对于now中给出的时间戳,或当前时间(如果未提供now)
此函数的每个参数都使用默认时区,除非该参数中指定了时区。小心不要在每个参数中使用不同的时区,除非是有意的。有关定义默认时区的各种方法,请参见date\u default\u timezone\u get()
您可以将UTC/GMT偏移量添加到日期时间(第一个参数),例如strotime('2016-02-25 14:35:00+0800')
或('2016-02-25 14:35:00 GMT+08:00')
将转换为1456382100
strotime
在PHP设置中使用时区。根据时区设置,它可能会转换为尚未发生的时间。例如,在我的乌克兰服务器上,strotime('2016-02-25 14:35:00')
转换为1456403700
,在另一个时区(美国/太平洋)的服务器上转换为1456439700
引自PHP文档:
该函数期望得到一个包含英文日期格式的字符串,并将尝试将该格式解析为Unix时间戳(自1970年1月1日00:00:00 UTC以来的秒数),相对于now中给出的时间戳,或当前时间(如果未提供now)
此函数的每个参数都使用默认时区,除非该参数中指定了时区。小心不要在每个参数中使用不同的时区,除非是有意的。有关定义默认时区的各种方法,请参见date\u default\u timezone\u get()
您可以将UTC/GMT偏移量添加到日期时间(第一个参数),例如strotime('2016-02-25 14:35:00+0800')
或('2016-02-25 14:35:00 GMT+08:00')
将转换为1456382100
如果使用PHP的DateTime
和DateInterval
类及其方法,可能会更加方便:
function timeSince($datetime) {
$now = strtotime("now");
$then = strtotime($datetime);
$dt_now = new DateTime("@" . $now);
$dt_then = new DateTime("@" . $then);
//DateTime's diff method returns a DateInterval object which got a format method:
return $dt_now->diff($dt_then)->format('%a days, %h hours, %i minutes and %s seconds');
}
一些测试用例:
//my local date & time is around "2016-02-25 19:49:00" when testing
echo '<pre>';
echo timeSince('2016-02-25 19:30:00');
//0 days, 0 hours, 19 minutes and 11 seconds
echo PHP_EOL;
echo timeSince('2013-11-02 15:43:12');
//845 days, 4 hours, 4 minutes and 3 seconds
echo PHP_EOL;
echo timeSince('2017-01-31 00:22:45');
//340 days, 4 hours, 35 minutes and 30 seconds
echo PHP_EOL;
echo timeSince('1950-05-14 07:10:05');
//24028 days, 12 hours, 37 minutes and 10 seconds
echo PHP_EOL;
//测试时,我的本地日期和时间大约为“2016-02-25 19:49:00”
回声';
回声时间间隔('2016-02-25 19:30:00');
//0天0小时19分11秒
echo PHP_EOL;
回音时间间隔('2013-11-02 15:43:12');
//845天4小时4分3秒
echo PHP_EOL;
回声时间间隔('2017-01-31 00:22:45');
//340天4小时35分30秒
echo PHP_EOL;
回声时间间隔('1950-05-1407:10:05');
//24028天12小时37分10秒
echo PHP_EOL;
代码部分基于此答案:如果使用PHP的DateTime
和DateInterval
类及其方法,可能会更方便:
function timeSince($datetime) {
$now = strtotime("now");
$then = strtotime($datetime);
$dt_now = new DateTime("@" . $now);
$dt_then = new DateTime("@" . $then);
//DateTime's diff method returns a DateInterval object which got a format method:
return $dt_now->diff($dt_then)->format('%a days, %h hours, %i minutes and %s seconds');
}
一些测试用例:
//my local date & time is around "2016-02-25 19:49:00" when testing
echo '<pre>';
echo timeSince('2016-02-25 19:30:00');
//0 days, 0 hours, 19 minutes and 11 seconds
echo PHP_EOL;
echo timeSince('2013-11-02 15:43:12');
//845 days, 4 hours, 4 minutes and 3 seconds
echo PHP_EOL;
echo timeSince('2017-01-31 00:22:45');
//340 days, 4 hours, 35 minutes and 30 seconds
echo PHP_EOL;
echo timeSince('1950-05-14 07:10:05');
//24028 days, 12 hours, 37 minutes and 10 seconds
echo PHP_EOL;
//测试时,我的本地日期和时间大约为“2016-02-25 19:49:00”
回声';
回声时间间隔('2016-02-25 19:30:00');
//0天0小时19分11秒
echo PHP_EOL;
回音时间间隔('2013-11-02 15:43:12');
//845天4小时4分3秒
echo PHP_EOL;
回声时间间隔('2017-01-31 00:22:45');
//340天4小时35分30秒
echo PHP_EOL;
回声时间间隔('1950-05-1407:10:05');
//24028天12小时37分10秒
echo PHP_EOL;
代码部分基于此答案:对于我来说,您的示例的$time值应该为负值,因为它在2016年2月25日还没有到下午2:35。对于我来说,您的示例的$time值应该为负值,因为它在2016年2月25日还没有到下午2:35。或者,使用abs($time()-$oldtime)代码>谢谢你的回复,据我所知,time()总是返回一个较大的数字,因为它是最近的,这就是为什么我对它有这样的问题。我在其他堆栈查询中看到过类似的情况。我的想法错了吗?干杯。或者,使用abs($time()-$oldtime)代码>谢谢你的回复,据我所知,time()总是返回一个较大的数字,因为它是最近的,这就是为什么我对它有这样的问题。我在其他堆栈查询中看到过类似的情况。我的想法错了吗?干杯。谢谢你的回复Igor,这可能是问题所在,因为我以前使用过类似的代码,没有遇到过这个问题。我将测试它并报告回来。感谢Igor的回复,这可能是问题,因为我以前使用过类似的代码,没有遇到这个问题。我将测试并报告。谢谢你的帮助,虽然我的具体问题的答案在下面得到了回答,但我想说我同意你的意见,这是一个更简单的解决方案。谢谢你