2016-02-25 34 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歡迎您! –