2012-09-21 104 views
2

有很多關於處理日期的建議。我只想澄清一些事情。比方說:PHP可以安全地使用unix時間戳來查詢mysql數據庫嗎?

  • 用戶插入記錄到數據庫中
  • UNIX插入日期的時間戳該記錄

現在用戶要查詢的日期間隔在數據庫中生成:

  • user在當地時區提供了2日期
  • 使用這些值將時區轉換爲UTC並獲取timest amp
  • 根據轉換中的2個整數查詢數據庫中的記錄(例如, WHERE日期> = FIRST和日期< =秒)
  • 再次轉換檢索到的時間戳到本地時區顯示

我知道這將是可能的,使用PHP,但並不會需要關心MySQL的時區在這種情況下設置 - 只有PHP的。該系統將是64位,所以用盡空間來存儲日期不是問題。但...

會引發任何其他嚴重問題,如DST更改或其他?

+0

是什麼讓你懷疑這些問題?由於您不確定Mysql如何處理這些時間戳,例如數據庫中屬於哪個時區?你是否將日期存儲爲Unix時間戳,或者如何存儲它們? – hakre

+0

我本性可疑。由於我不知道日期和時間處理的所有信息,因此我很自然地只是爲了確保一切正常而尋求答案。不,我將unix時間戳存儲爲大整數而不是TIMESTAMP字段。我不想讓MySQL甚至知道我們在這裏處理日期。 – Marius

+0

然後請參閱我會說的@ Tadeck的答案。 – hakre

回答

2

Unix時間戳是時區無關的。

這也是你可以改變這一步的原因:

使用這些值時區轉換爲UTC,並獲得時間戳

成這樣:

轉換值到Unix時間戳

儘管在數據庫中存儲時間戳(例如, MySQL)非常簡單。您可以確保PHP具有Unix時間戳,如果你會:

  • 節約利用FROM_UNIXTIME() MySQL的函數值(給Unix時間戳作爲參數,你會根據MySQL的設置接收日期時間),
  • 檢索值通過使用UNIX_TIMESTAMP() MySQL的函數(給出字段的名稱或值,作爲參數),所以您將根據MySQL的設置根據存儲在數據庫中的日期時間獲得Unix時間戳(整數)。

只記得使用TIMESTAMP列類型來存儲時間戳。這樣,時間將以與時區無關的方式存儲,僅根據MySQL的設置進行顯示。

+0

你對MySQL的版本是正確的,但是......我希望能夠獨立於MySQL來做一些事情。會(在你的情況下)我能夠安全地獨立於MySQL的時區設置工作? – Marius

+0

@Marius:我只是說'TIMESTAMP'與包含Unix時間戳的'INT'非常相似,並且沒有時區問題。看幾對比(這真是一個全新的討論主題):http://stackoverflow.com/a/7029306/548696和http://stackoverflow.com/a/3315655/548696。當涉及到獨立於MySQL的事情時,一些抽象層可能包括PHP和MySQL之間的轉換(就像在各種ORM中),你不會完全隱藏MySQL。此外,使用'TIMESTAMP',您可以使用與DATETIME相關的功能,分組等。 – Tadeck

+0

感謝您的解釋。我以爲我可以不用mysql。那是......直到你提醒我關於分組:)我想我必須存儲TIMESTAMP。 – Marius

0

Tadeck是正確的,Unix時間戳是時區無關的。

但是,當在整個應用程序中使用時間戳時,應該在數據庫中存儲和使用時間戳作爲簡單的INT。在應用程序級別轉換本地時區(在PHP中)。這允許您只關心PHP中的時區而不是2個系統中的時區。它還簡化了應用程序級別爲個人用戶設置時區。

+0

謝謝,但重點在於,當使用'TIMESTAMP'列時,日期時間也以與時區無關的格式存儲,並且不會以任何方式限制您允許用戶以自己的方式設置時區。 MySQL的'TIMESTAMP'專欄專爲此設計:用於存儲時間戳。雖然存儲時間戳有兩種不同的觀點:有人說你應該使用'INT',有人說你應該使用'TIMESTAMP'(那些說你應該使用'DATETIME'的人當然是不正確的;))。 – Tadeck

+0

我明白這一點,但時間戳只是INT。所以當在SQL中進行比較時,INT很好。任何我喜歡在應用程序級別執行的本地轉換。這樣mysql的時區設置就無關緊要了。 –

+0

儘管我將它們存儲爲大整數。 – Marius

相關問題