時區簡單理解
https://zh.wikipedia.org/wiki/%E6%97%B6%E5%8C%BA
上面的鏈接是時區的wiki說明,下面說說我記住的部分:
GMT時區是格林威治標准時間,我把它理解為 “真實時間”
UTC時區是根據GMT得來的“世界標准時間”,它的時間和GMT是相同的
CST可以指下列的時區:
澳洲中部時間,Central Standard Time (Australia)
中部標准時區(北美洲),Central Standard Time (North America)
北京時間,China Standard Time
古巴標准時間,Cuba Standard Time,參見北美東部時區
其中我們所在的時區背景時間 CST=UTC+8小時,也就是說,真實時間是0點的時候,背景時間是8點
ISO_8601日期格式標准
https://zh.wikipedia.org/wiki/ISO_8601
上面是日期格式標准的wiki
當前的UTC時間是2016-01-07T01:58Z,其中Z是4位數字格式的時間偏移量,不寫的時候默認不偏移。
其中,字母T代表使用UTC時間,字母Z代表時間偏移量,實際寫法中字母Z應該被偏移量替換,例如 "2017-1-7T10:21+0800"或者"2017-1-7T10:21-0800",字母Z被+0800和-0800替換了。
在瀏覽器中直接new一個date對象,因為我們處於UTC+0800的時區,所以控制台給我們打印出來的時間是GMT+0800的時間
2016-01-07T00:00 代表UTC時區1月7日0時0分(在控制台中顯示UTC+0800時區為8時0分)
2016-01-07T00:00 0800 代表UTC+0800時區1月7日0時0分,2016-01-07T00:00 -0800 代表UTC-0800時區1月7日0時0分,在控制台中顯示分別如下
通過日期字符串new一個Date對象,輸入的時間字符串是2016-1-7 10:21,沒有帶ISO標准的“T”字母,因此瀏覽器認為我們想輸入的是當地時間
HTML5 input標簽datetime屬性
下面問題來了,我要在頁面上輸入一個時間,存入數據庫,上面說了那么多時區,那么用戶在頁面上輸入的時間應該是哪個時區的呢,傳到server,存入db的應該又是哪個時區的呢?
經測試
<input type="datetime" /> chrome上是不支持的
<input type="datetime-local" /> chrome支持
Google了一下據說是因為datetime輸入框輸入的是本地時區,考慮到時區的問題chrome沒有支持此輸入類型,會降級為text類型
datetime-local輸入類型chrome是支持的,獲取的value格式是:
"2016-1-7T10:21"
如上面所述,這個時間是標准UTC時間,這種時間從前端到后台到存入db,都是不會發生錯誤的。
但是對用戶來說,他填寫表單的時候想的時間肯定是他所在位置的本地時間,比如我輸入"2016-1-7 10:21",我真實想輸入的時間是"2016-1-7T10:21+0800",而不是"2016-1-7T10:21"。
為了支持這種情況,我需要把"2016-1-7T10:21"轉換為用戶真實想要的當地時間"2016-1-7 10:21",於是"2016-1-7 10:21".replace("T"," "),它實際代表的真實時間(UTC時間)是"2016-1-7T10:21+0800"
這樣在前端是沒問題了,但是傳到后端之后,這樣的非ISO標准時間是沒有攜帶時區信息的,服務器收到之后會將這個時間安裝服務器所在時區來處理,處理之后所代表的真實時間就和用戶輸入的真實時間不同了。所以我們在前端得把時間轉換為ISO標准時間格式再傳給服務器,這樣服務器就能明白用戶輸入的真正的時間了,另一種方法,也可以把時間用毫秒數表示,傳到后端,不過這種方式可讀性不太好。
// 1.將字面時間轉化為本地時間 2.將本地時間轉換為真實GMT時間傳入后台 function getRealGMT(datetime){ datetime=datetime.replace("T"," "); var temp=new Date(datetime); var realGMT=temp.getTime()+temp.getTimezoneOffset()*60000; return new Date(realGMT).format("yyyy-MM-ddThh:mm"); }

mysql時區
