2016-02-25 35 views
1

我写了一个函数以来的时间来返回自给定的MySQL日期时间以来的时间。当从当前时间()获取$ oldtime时,当我需要一个正整数时,它返回一个负整数。我以前用其他语言编写过类似的函数,但是我已经对这个问题失明了,所以任何帮助都会很感激。PHP的时间自功能错误

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

对于我来说,你的榜样应该有$时间为负值,因为它不是在2016年2月25日2:35 PM还。 – kainaw

回答

2

strtotime使用时区在你的PHP设置。根据设置的时区,可能会转换为尚未发生的时间。例如,在我的乌克兰服务器上,strtotime('2016-02-25 14:35:00')转换为1456403700,在另一个时区(美国/太平洋)的服务器上,它将转换为1456439700

从PHP文件引用:

函数需要接受一个包含英语日期格式的字符串,并会尝试解析格式为Unix时间戳(自1月1日的秒数1970年00: 00:00 UTC),相对于现在给出的时间戳,或者当前时间(如果现在没有提供)。

除非在该参数中指定了时区,否则此函数的每个参数都使用默认时区。除非有意使用,否则小心不要在每个参数中使用不同的时区。有关定义默认时区的各种方法,请参阅date_default_timezone_get()。

您可以添加UTC/GMT偏移到您的日期时间(1 PARAM),例如strtotime('2016-02-25 14:35:00 +0800')('2016-02-25 14:35:00 GMT+08:00')将转换为1456382100

+0

感谢您的回复伊戈尔,这可能是问题,因为我以前使用过类似的代码,并没有遇到这个问题。我会测试它并报告回来。 – user2784408

0

在你的榜样,$oldtime必须比当前time()较小的值。

所以,如果你想要更大的价值之间的计时,根本扭转你的公式:

这条线: $time = time() - $oldtime;

变为: $time = $oldtime - time();

+2

或者,使用'abs($ time() - $ oldtime);' – kainaw

+0

感谢您的回复,据我所知time()总是会返回一个更大的数字,因为它是最近的,这就是为什么我是有这样的问题。在其他堆栈查询中,我已经看到它与此类似。我的想法错了吗?干杯。 – user2784408

3

,如果你使用PHP的DateTimeDateInterval类和它可能是方便多了方法:

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; 


代码部分基于这样的回答:https://stackoverflow.com/a/19680778/3391783

+0

感谢您的帮助,虽然我的具体问题的答案在下面得到了回答,但我想说我同意您的意见,这是一个更简单的解决方案。 – user2784408

+0

@ user2784408欢迎您! –