2009-11-01 140 views
4

我試圖確定在JSON Twitter源中給出的代表日期和時間的字符串是否在MySQL中的時間戳列的範圍內。MySQL和PHP中的時間戳比較(UT​​C,+0000,時區)

這裏的例子字符串:

'Sat, 31 Oct 2009 23:48:37 +0000', 

根據APIcreated_at)的+0000表明它確實是UTC。現在,我正在使用strtotimedate來確認時間。附:

$t = 'Sat, 31 Oct 2009 23:48:37 +0000'; 
$timestamp = strtotime($t); 

echo date('M d Y H:m:s', $timestamp); 

我得到Oct 31 2009 19:10:37。如果我刪除+0000我得到Oct 31 2009 23:10:37。所以+0000與沒有它之間的區別是4小時。我猜是因爲我的本地時區(馬里蘭州,美國= America/New_York),與UTC顯然不同。

我不太確定我是否應該剝離+0000或試圖確定此時間戳存儲在我的數據庫中的兩個時間戳,這是2009-10-30 23:16:382009-11-25 12:00:00的範圍內時使用它。我覺得自己很傻,現在有點混亂,當我填充這些時間戳YYYY-MM-DD H:M:S從一個Javascript日期時間選擇器來了,一個示例格式是10/31/2009 11:40 am我用STR_TO_DATE像這樣:

STR_TO_DATE("10/31/2009 11:40 am", "%m/%d/%Y %l:%i %p")'), 

我應該離開+0000還是去掉它? 精神上水龍頭出來

回答

5

你當然應該留下的時區信息,只要你也正確setting the server timezone。否則有什麼意義,你所有的時間比較都是4個小時。 :o)

比較你應該將它保留爲UNIX時間戳的時間,即strtotime的結果。

$twitterTS = strtotime('Sat, 31 Oct 2009 23:48:37 +0000'); 
$localStartTS = strtotime('Sat, 31 Oct 2009 19:00:00'); // timezone is -0400 implicitly 
$localEndTS = strtotime('Sat, 31 Oct 2009 20:00:00'); 

if ($localStartTS <= $twitterTS && $twitterTS <= $localEndTS) { 
    // twitter timestamp is within range 
} 

澄清:從不同的時區的時間比較之前,確保它們都轉換成相同的時區。比較倫敦時間20:00至紐約時間20:00不帶時區信息將產生不正確的結果。 strtotime將所有時間轉換爲當地時區;如果時區信息存在於輸入中,它將遵守它並適當地轉換時間,否則它會假定時間已經被本地化。如果數據庫中的所有時間都是本地的,那麼您應該確保本地化您想要與它們進行比較的所有時間戳。
另一種策略是在存儲或比較它們之前,始終將所有時間轉換爲UTC。

隨你的選擇,一直這樣做。

0

在PHP中,你可以簡單地使用字符串函數的JSON Twitter的時間分解成組件,從而

//'Sat, 31 Oct 2009 23:48:37 +0000' 
$hour = substring($jsontime,18,2); 
$minute = substring($jsontime,22,2); 
... 

$phpDatetime mktime($hour,$minute,$second,$month,$day,$year); 

從那裏,我想你已經擁有它。不要忘了調整GMT差異。