1. 程式人生 > >在瀏覽器的JavaScript裡new Date().toUTCString()後,傳遞給C# DateTime().TryParse()會發生什麼?

在瀏覽器的JavaScript裡new Date().toUTCString()後,傳遞給C# DateTime().TryParse()會發生什麼?

Format 1. Sun, 09 Oct 2016 13:24:35 GMT
Format 2. Sun, 9 Oct 2016 13:36:09 UTC

Format 1 是在IE裡面產生的(Windows10下的Edge和IE已經使用Format2)
Format 2 是Edge/Firefox/Safari/Chrome等產生的格式(這麼說不太嚴謹,應該帶上版本號)
那麼採用DateTime.TryParse,Format 1會報錯,而Format 2會成功。

我們先看一下C#下DateTime的格式,開啟TryParse的文件,很長,似乎看不懂。用ILSpy查一下原始碼,在程式碼中,我們似乎只能找到GMT字眼,卻找不到UTC字眼。

通過程式碼,我們知道了這樣的格式,C#DateTime中微軟遵循了RFC1123標準(從這裡扒出來的線索),我們找到RFC1123 第5.2.14節文件,5.2.14 Date and Time Specification章節,發現它引用的是RFC822 第5節的內容,在裡面關於zone的內容中,只提及了GMT作為關鍵字,並沒有使用UTC的字眼。

但是在IE中微軟toUTCString方法,僅提到了UTC時間,並沒有提到Format 1和Format 2之間的差異以及版本變更,在IE的版本變更資訊中也沒有提及具體的變化細節。

我們嘗試從其它瀏覽器的文件裡面找到蛛絲馬跡,於是來到了FireFox的官方文件

。在文件中,我們找到了ECMAScript 5.1ECMAScript 6的文件,其實二者沒有區別,只是一個已定稿一個是在草稿狀態。它們提到的格式說明在這裡。文中,提到是基於ISO 8601標準進行實現的。但是我們可以發現ISO 8601所定義的標準,大多是YYYY-MM-DDTHH:mm:ss.sssZ格式的,其中的Z並不是GMT也不是UTC。

注意到在IE9和其它瀏覽器中都支援toISOString方法,這個方法,返回的正是以上格式的資料。
再回到toUTCString的各種定義,我們會發現一句話叫:生成人類可讀易讀的格式,比如C# DateTime的ToString可以傳遞格式o或者r,而且除了RFC1123中明確提到GMT字眼外,其它地方並未提到UTC,既然是給人閱讀的,人是聰明且智慧的,GMT還是UTC大家都能看懂,但是我們的命題其實是給機器讀的。這個時候,我們更建議使用ISO 8601的YYYY-MM-DDTHH:mm:ss.sssZ

在不同的系統間進行傳遞,既能表現世界時,又能保證各種程式轉換的正確性。

臨時解決辦法:

既然IE舊版中的toUTCString方法,所產生的資料僅是UTC字眼和GMT字眼的差異,那麼在進行TryParse之前,替換一下字元即可。注意一點,在IE中,如果“日”為1位數的話,比如是10月9日,那麼可能顯示的是9 Oct,這個在ECMA的標準中,還是明確提到要補齊為“09”,不過對於C#的DateTime.TryParse,則沒有什麼影響。

相關推薦

瀏覽器JavaScriptnew Date().toUTCString()遞給C# DateTime().TryParse()發生什麼?

Format 1. Sun, 09 Oct 2016 13:24:35 GMT Format 2. Sun, 9 Oct 2016 13:36:09 UTC Format 1 是在IE裡面產生的(Windows10下的Edge和IE已經使用Format2) Format 2 是Edge/Firefox/S

javascriptnew Date().toLocaleString()在不同瀏覽器中的結果不一致的解決方法

Date.prototype.toLocaleString = function () { return this.getFullYear()+’-’+(this.getMonth()+1)+’-’+this.getDate()+’ &nbsp’+this.getHou

javascriptnew Date()的瀏覽器相容性問題

正確的做法: [html] var time1 = (timestart+' 00:00:00').toString();   var time2 = (timeend+' 23:59:59').toString();   timestart = new Date(Date.parse

javascriptnew Date()物件和getTime()方法的問題(又是來提問(-__-)b)

昨天到現在一直在完成一個用canvas實現的倒計時的小案列,用到Date物件和getTime方法來計算倒計時的時間。老是有問題,不知道怎麼回事。貼error: 昨天是2016年7月18日 endTim

解決JavaScriptnew Date(string)在IE不相容的問題

1.問題描述: let date = '2018.09.17' let dateStr = new Date(date); let year = dateStr.getFullYear(); l

關於瀏覽器快取問題(圖片更換頁面仍優先讀取快取)

因為部分需求(跟換頭像,切換輪播圖等等)改變圖片或者本地上傳新圖片,會導致圖片快取問題,從而達不到預期效果,還是載入原圖片查找了一些資料,總結出2個步驟: 1.在圖片的路徑的後面拼接 ‘?內容’ 解決,具體如下 (1)在圖片src路徑後面加上時間戳,使瀏覽

util包和sql包Date類區別該用哪一個

java.util.Date表示特定的瞬間,精確到毫秒---------------------------------------java.sql.Date一個包裝了毫秒值的瘦包裝器 (thin wrapper),它允許 JDBC 將毫秒值標識為 SQL DATE 值。毫秒

瀏覽器中輸入URL執行的全部過程。用到哪些協議?(一次完整的HTTP請求過程)

一次完整的HTTP請求過程: 1.首先進行域名解析,域名解析具體過程講一下: 瀏覽器搜尋自己的DNS快取,快取中維護一張域名與IP地址的對應表; 若沒有,則搜尋作業系統的DNS快取; 若沒有,則作業系統將域名傳送至本地域名伺服器(遞迴查詢方式),本地域名伺服器查詢自己

Eclipse選一個變數這個類的該變數不變色了

1.使用“Alt+Shift+O”對該提示功能的開/關切換 2.可以在以下設定選中後的文字提示顏色   window--> Preferences--> General--> Editors--> Text Editors--> Annotat

關於 safari瀏覽器 不支援new Date 顯示NaN的問題記錄

知識點:new Date問題: safari瀏覽器 顯示 NaN因為 JS中要求Date型別轉換的原始資料格式是yyyy/mm/dd之類的,所以橫崗 - 要替換掉才可以今天同事來問,我一看果然啊,mac版高階的safari 沒問題,就老版本的 safari5.0 及以下有問題

javascript從資料庫獲取資料生成EasyUI樹

不用管是什麼資料庫,php還是java語言只要資料庫表字段是有自身指向的結構的都行。廢話少說,直接上程式碼<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <titl

當程序退出動態申請的內存自動釋放嗎

you disk -m sign min aps call pen height stackoverflow有人問了這麽一個問題,下面這段程序執行完畢後,malloc的內存會釋放嗎 [cpp] view plain copy <span style="fo

JavaScript XMLHttpRequest GetUrlResponse 前端向值並獲得XML格式Response.

同步方式一般用於需要對觸發結果執行動作。 比如點選button彈出新的頁面, 頁面中獲取到Response的值,需要對彈出頁面進行處理。 非同步方式用於不需對觸發結果執行動作。 比如觸發結果是頁面多加一些元素,或者取到或更新某些值。不需要對這些元素和值進行處理。 同步

幾個有意思的小程式當無限迴圈遇到sleep發生什麼 !!!∑(゚Д゚ノ)ノ

今天翻文件的時候找到了幾個剛學Java的時候的小程式,跟大家共享一個,其他點 這裡 下載(下載連線包含所有展示的程式,如果實在沒幣可以私聊我,我給你發一份,有幣就支援一下把,謝謝) 這是倒數第二個的程式碼,非常簡單,矩陣的那個複雜一些,但是更有意思,點 這裡下載(下載連線包

獲取當前系統時間兩小時和四小時蘋果瀏覽器報錯NaN或者Invalid Date,

    <script type="text/javascript" src="js/libs/jquery.min.js"></script>    <script type="text/javascript" src="j

new Date 計算出當前日期n天的日期 以及 根據兩個日期計算出一共經歷了幾天 (包含了在ie和火狐中的相容)

1、計算出當前日期後n天的日期 getAfterFormatDate (days) { // 如果需要計算當前的日期 傳 0 即可 (此例是考慮時分秒的情況) let dd = new Date() dd.setDate(dd.ge

new Date()在安卓下正常在IOS下顯示不出來

顯示 安卓 strong fine def 不支持 返回 方案 nbsp 之前用JS在做一個倒計時,在PC端和安卓下面顯示沒問題,在IOS下顯示不出來。 查找了資料,鏈接我忘記了。 原因是:   在IOS下,new Date("2000-2-22 00:10"),返回的

javascript創建css、jsonload觸發callback兼容主流瀏覽器的實現

question 禁止 rules 跨域問題 onload targe 結合 defined finally http://www.fantxi.com/blog/archives/load-css-js-callback/ 由於需要寫個函數,既可以加載css,又可

因實現本地瀏覽器訪問nginx修改配置文件安裝vsftpd失敗

ping 配置 href vsftpd blank dns echo aid vsftp 解決方法如下(修改dns配置) vi /etc/resolv.conf 在此文件最後加入:nameserver 8.8.8.8 如果沒有vi編輯器可用: echo "nameserve

javascript: new Date()

zone utc mts var 下午 scrip .get 中國 ear var date = new Date(); date.toString(); // "Tue Jan 02 2018 15:03:07 GMT+0800 (中國標準時間)" date.getD