MySQL有兩種數據類型,專門用於存儲日期&時間值 - DATETIME
和TIMESTAMP
。這兩種類型都不存儲時區信息,並且都有不同的規則。在MySQL中使用NOW()時,我可以確定正確的UTC值將被存儲在TIMESTAMP列中嗎?
A DATETIME
列將存儲插入查詢中提供的確切日期&時間值。 (沒有converstions和時區沒有啓示)
甲TIMESTAMP
列將轉換從在插入時間爲UTC的連接的時區設置在插入的日期&時間值。檢索時,它會將日期爲&的時間值從UTC存儲到檢索連接的時區。 兩個連接的時區可根據這些rules顯式或隱式設置。
現在,在我開始討論我的問題之前,我們來看看處理日期&時涉及夏令時的一些細微差別。總結在另一個Stack Overflow question以及什麼我從MySQL documentation瞭解關於日期/時間的答案:
- 當使用
DATETIME
列,並明確指定的值(即/2009-11-01 01:30:00
),該值可以是不明確的。DATETIME
不進行對話,只是存儲這個確切的日期/時間。假設我在紐約(遵循夏令時)。在插入和檢索時,我無法指示/知道這個值是指在夏令時(UTC-4)的1:30 AM還是無日光節約時刻的1:30 AM(UTC-5 )。 - 當使用帶
NOW()
沿着DATETIME
柱,NOW()
計算結果爲日期&時間值在查詢執行的開始(即/2009-11-01 01:30:00
),並且該值被插入,沒有converstions,進DATETIME
場引起完全相同的歧義正如剛纔提到的。 - 當使用
TIMESTAMP
列並明確指定一個值(即/2009-11-01 01:30:00
)時,我再次遇到了與上述相同的問題。沒有辦法指定,也無法知道我指的是哪一天。
現在,這裏是我的問題:
鑑於被設置爲包括夏令時區(比如America/New York
)MySQL數據庫連接,我可以肯定的是將NOW()
成TIMESTAMP
列將導致正確的UTC日期&要存儲的時間值? UTC當然不遵守夏令時,所以UTC時間爲1:30 am紐約時區夏時制時間與UTC時間不同上午1:30紐約時區無日光節約時刻。
更具體地說:是對UTC偏移量查詢執行的開始連接時區的用途是什麼,當我從一個TIMESTAMP
柱插入/選擇進行到UTC /從-UTC轉換?回到我的例子,在凌晨1:30,夏令時(America\New York
時區),我在UTC-4和上午1:30沒有夏令時(America\New York
時區)我在UTC- 5 - 所以在這兩個時刻,當我明確插入2009-11-01 01:30:00
或通過使用NOW()
隱式插入相同的值時,是否會在TIMESTAMP
字段中存儲不同的值?最後,如果我處於跨越這兩個時刻的單個MySQL連接中,並且我執行兩個查詢(一個在第一個時刻,另一個在第二個時刻),兩個查詢都會導致正確的(不同的)UTC值要存儲?
你讀過[this](http://stackoverflow.com/questions/1646171/mysql-datetime-fields-and-daylight-savings-time-how-do-i-reference-the-extra)和[那](http://www.webdevelopersdiary.com/blog/good-to-know-how-to-properly-store-date-and-time-values-in-mysql)? –
數據庫UTC。表示層用戶首選項和時區。 – danny117