我正在写一段时间,因为函数返回给定的mysql datetime以来的时间。当从当前时间()获取$ oldtime时,当我需要一个正int时,它返回一个负int。我以前在其他语言中写过类似的函数,但是我已经对这个问题视而不见了,所以任何帮助都会非常感激。
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');
答案 0 :(得分:3)
如果您使用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;
答案 1 :(得分:2)
strtotime
在您的PHP设置中使用时区。根据时区设置,它可能会转换为尚未发生的时间。例如,在我的乌克兰服务器上,strtotime('2016-02-25 14:35:00')
转换为1456403700
,在另一个时区(美国/太平洋地区)的服务器上转换为1456439700
。
引用PHP文档:
该函数期望给出一个包含英文日期格式的字符串,并尝试将该格式解析为Unix时间戳(自1970年1月1日00:00:00 UTC以来的秒数),相对于给定的时间戳。现在,或者现在没有提供当前时间。
除非在该参数中指定了时区,否则此函数的每个参数都使用默认时区。除非是这样,否则请注意不要在每个参数中使用不同的时区。有关定义默认时区的各种方法,请参阅date_default_timezone_get()。
您可以将UTC / GMT偏移量添加到日期时间(第一个参数),例如strtotime('2016-02-25 14:35:00 +0800')
或('2016-02-25 14:35:00 GMT+08:00')
将转换为1456382100
答案 2 :(得分:0)
在您的示例中,$oldtime
必须小于当前time()
的值。
所以,如果你想计算较大值之间的时间,只需颠倒你的等式:
这一行:
$time = time() - $oldtime;
变为:
$time = $oldtime - time();