ISO日期格式標准,瀏覽器到服務器到mysql中的時區


時區簡單理解

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時區

 
mysql可通過 show variables like '%time_zone%';命令來查看數據庫設置的時區。我們的CST時區代表的是中國區的時區,即UTC+0800
所以服務器把從前端收到的ISO日期 "2016-1-7T02:21"收到之后,寫入mysql的datetime字段,mysql的datetime字段會根據它的CST時區把日期轉換過來,於是顯示的日期就是"2016-1-7 10:21",代表的真實時間是"2016-1-7T10:21+0800"


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM