2014-10-30 114 views
0

我有一個應用程序,用戶輸入時間/日期,然後通過strtotime()轉換成Unix時間戳(用戶設置自己的時區)。這通常工作得很好; strtotime甚至設法將諸如2014年3月9日2:15 AM之類的時間轉換爲時間戳(其對應於如果用戶輸入「2014年3月9日上午3:15」將返回的時間戳)。PHP strtotime和DST

但是,例如,用戶想要輸入2014年11月2日上午的時間 - 具體地說,在2點到3點之間。是否有一個元素,用戶可以添加到指定哪個時間將被使用?

例如,如果用戶通過strtotime()通過'2014年11月2日2:15',則結果是與該日期的「second」2:15對應的UNIX時間戳。

如何指定「第一個」2:15?

+1

我建議你使用'DateTime'和'DateTimeZone'類而不是'strtotime()' – Phil 2014-10-30 02:37:55

+0

對不起,這個天真的問題,但我不知道這對用戶會有用嗎?我意識到我最初的帖子有點不清楚,所以我編輯了它。目前,該應用程序接受來自用戶的輸入,例如2014年11月2日2:15 AM。有沒有一個字符串*用戶*(不是編碼器,因爲我在我的OP中寫錯了)可以輸入來告訴程序*他們打算使用哪個*「2:15」?或者這是我不得不使用DateTime的東西嗎?再次,對於混淆抱歉! – user3092995 2014-10-30 02:58:04

+1

這基本上沒有解決方案。 11月2日凌晨2點15分有兩個。在這段時間裏你什麼也不做,除非你不介意可能要等一個小時。這就是爲什麼切換髮生在週末深夜,以減少這種情況導致的問題最小化。在我意識到的現實世界的任何地方都沒有官方的解決方案。 – deceze 2014-10-30 03:08:53

回答

0

您可以包含一個時區偏移或縮寫以及要解析的字符串,並且它通常會選擇正確的時間戳。

例如,假設你已在美國東部時區("America/New_York")工作,你可以包括這樣的偏移:

strtotime('2:15 AM November 2, 2014 -0400') // 1414908900 
strtotime('2:15 AM November 2, 2014 -0500') // 1414912500 

或者由縮寫:

strtotime('2:15 AM November 2, 2014 EDT') // 1414908900 
strtotime('2:15 AM November 2, 2014 EST') // 1414912500 

現在我之所以說「通常」是因爲時區縮寫可能不明確。檢查Wikipedia's list of time zone abbreviations,有兩種不同的「EST」的解釋,有些更糟糕,比如5種不同的「CST」的解釋。一般來說,依靠輸入的時區縮寫是不好的。堅持抵消,你會沒事的。

當然,您仍然需要知道哪些偏移量適用於哪些時區。在PHP中,您可以使用timezone_offset_get

您可能也有興趣this question, and it's answer,它可以幫助您確定您的輸入時間是無效的或模糊的。然後,您可以相應地提示用戶,並且(在含糊的情況下)要求他們在兩種可能的偏移之一中進行選擇。