1. 時間戳
時間戳是指格林威治時間1970年01月01日00時00分00秒(北京時間1970年01月01日08時00分00秒)起至現(xiàn)在的總秒數。
也就是說,時間戳它是一個偏移量,比如時間戳 1551618793,就是指距離 1970-01-01 00:00:00 這個基準時間 1551618793 秒的時間,就是格林威治時間 2019-03-03T13:13:13+00:00(這個時間表示法見下面的 ISO 8601 介紹)。
2. 格林尼治標準時間
格林尼治標準時間(Greenwich Mean Time,GMT)是指位于倫敦郊區(qū)的皇家格林尼治天文臺的標準時間,因為本初子午線被定義在通過那里的經線。理論上來說,格林尼治標準時間的正午是指當太陽橫穿格林尼治子午線時的時間。
同時格林尼治標準時間也是世界基準時間,全世界被劃分為24個時區(qū),以尼治標準時間為0時區(qū),其他時區(qū)在此時間上加上時區(qū)偏移量,比如我們中國北京時間就是+8區(qū),格林威治時間 2019-03-03T13:13:13+00:00,就是北京時間的 2019-03-03T21:13:13+08:00。
3. UTC
協(xié)調世界時,又稱世界統(tǒng)一時間、世界標準時間、國際協(xié)調時間。由于英文(CUT)和法文(TUC)的縮寫不同,作為妥協(xié),簡稱UTC。
UTC時間是基于標準的GMT提供的準確時間,因此我們所說的UTC時間,也就是0時區(qū)的時間。
4. ISO 8601
ISO 8601 是國際標準化組織,對于日期和時間的一種標準表示方法。
如我們所說的 2019-03-03 21:13:13 這個日期時間上并沒有包含時區(qū)信息,在國際化上使用,顯然這么表示是無法滿足要求的,因此就有了 ISO 8601 日期時間表示法。
如北京時間 2019-03-03 21:13:13,ISO 8601 表示法為:2019-03-03T21:13:13+08:00,轉換為UTC時間就是 2019-03-03T13:13:13+00:00(或 2019-03-03T13:13:13Z,+00:00 可以用一個字母 Z 表示)。
1. INT 或 BIGINT
INT 可以存儲秒級時間戳(10位整數),BIGINT 可以存儲毫秒級時間戳(13位整數)。
注意點:
特點:
1. 時間戳沒有時區(qū)信息,必須系統(tǒng)自己約定使用什么時區(qū)的時間戳2. 只能表示 1970-01-01 開始的時間3. 不能使用 MySQL 提供的各種日期時間類函數4. 檢索方便
2. DATETIME
DATETIME 使用8字節(jié)存儲,因此能表示的時間范圍比較大,可表示 1000-01-01 00:00:00 到 9999-12-31 23:59:59 范圍的時間。
注意點:
特點:
1. 沒有時區(qū)信息,必須系統(tǒng)自己約定使用什么時區(qū)的時間2. 表示范圍廣3. 查詢效率沒有使用使用 INT 高4. 可以使用 MySQL 提供的種類日期時間函數
3. TIMESTAMP
MySQL 對于 TIMESTAMP 的存儲,內部使用的是4字節(jié)整數,又受限與時間戳定義,因此,可表示范圍大約只有 1970-01-01 00:00:01 到 2038-01-19 03:14:07。
TIMESTAMP 與時區(qū)相關,存入時會將時間從 MySQL time_zone 參數設置的時區(qū),轉換成 UTC 時間的時間戳存儲,讀取時,再從 UTC 時間戳轉換成 time_zone 參數設置的時區(qū)時間。
示例:
測試表結構
當前數據庫設置的時區(qū)為 +8區(qū)
插入一條記錄
修改time_zone為0時區(qū)設置后查看
可以看到,DateTime類型的,并沒有受時區(qū)設置變化影響,TIMESTAMP 類型自動根據修改后的當前時區(qū)設置顯示了正確的時間。 這個變化,并不是修改時區(qū)后,MySQL 把 TIMESTAMP 字段的值修改了,而是顯示時,根據當前時區(qū)正確顯示了,存儲的值并沒有變化,一直是 UTC 時間。
注意點:
特點:
1. 與時區(qū)相關,內部統(tǒng)一使用4字節(jié)的 UTC 時間戳存儲2. insert 可以使用 MySQL 的 CURRENT_TIMESTAMP 3. update 可以使用 MySQL 的 on update CURRENT_TIMESTAMP
不管使用 INT、DATETIME、TIMESTAMP 哪一種,系統(tǒng)都必須要關心時區(qū)
個人建議的實踐方式是將 MySQL 時區(qū)設置為 +00:00,數據應該是 UTC 時間入、UTC 時間出,各系統(tǒng)展示時,再從 UTC 時間轉換為相應的時區(qū)時間