[英]Ignore timezone offset while converting date - javascript
我有一個WCF REST服務,它以下面的格式返回日期:
/Date(1401993000000+0530)/
服務器上此日期的值為
6/6/2014 12:00:00 AM
我想在UTC值的javascript代碼中解析這個。
我嘗試手動刪除“+0530”字符串並將其解析為日期,但它給出了“無效日期”。
我也嘗試按照這篇文章添加時區偏移,但它給出的值不正確。
我怎么解析這個?
這種格式通常被稱為“ASP.NET JSON日期” - 因為它首先出現在ASP.NET和.NET的其他部分中使用的JavaScriptSerializer
和DataContractJsonSerializer
類中。 然而,它受到了極大的批評 ,並最終棄用了標准的ISO 8601格式,這是大多數現代.NET代碼中使用的Json.Net庫中的默認格式。 你仍然可以在WCF和舊版本的ASP.NET MVC中看到它。
此格式有兩個主要變體:
/Date(1401993000000)/
- /Date(1401993000000)/
時間戳 /Date(1401993000000+0530)/
- 帶偏移量的時間戳 您偶爾會看到使用反斜杠轉義的正斜杠,如\\/Date(1401993000000)\\/
,具體取決於它的生成方式。 這應該被解析器容忍,但不應該依賴。
在所示的兩種格式中,時間戳部分用於表示自Unix Epoch以來的毫秒數,即1970-01-01 00:00:00.000 UTC。
我說,“預期”,因為它是在.NET中可能有一個DateTime
與DateTimeKind.Unspecified
,它不可能被映射回UTC。 在這種情況下,序列化程序將表現為具有DateTimeKind.Local
。 然后,輸出將反映計算機本地時區中調整為UTC的值,以及該時間點的計算機UTC偏移量。 理想情況下,您不應該依賴此行為,因為您將從不同時區的計算機獲得不同的結果。
當輸出字符串中存在偏移時,它為+HHmm
/ -HHmm
格式,正值落在GMT以東 - 與ISO 8601標准的方向相同。 但是,與ISO 8601不同, 不會針對該偏移調整值部分。 它仍然是基於UTC的。
換一種說法:
/Date(1401993000000)/
= 2014-06-05T18:30:00Z
/Date(1401993000000+0530)/
= 2014-06-05T18:30:00Z
+ +0530
= 2014-06-06T00:00:00+05:30
因此,當使用此值創建JavaScript Date
對象時,偏移部分是無關緊要的 - 因為Date
對象以UTC格式包裝時間戳,並且沒有保留提供的偏移量的規定。
你當然可以將字符串分解成它的部分並自己使用它們,而是考慮使用Moment.js來解析這個字符串。 它本身可以理解格式,並且可以返回一個保留偏移知識的對象。
var m = moment.parseZone("/Date(1401993000000+0530)/");
m.format() // "2014-06-06T00:00:00+05:30"
如果您正在尋找Date
對象,您當然可以調用m.toDate()
。 生成的Date
對象將具有相同的UTC時間戳,但由於Date
對象的工作方式,任何本地時間函數將僅使用主機環境的偏移量。
換句話說,對於Date
對象的輸出,輸入的+0530
部分變得無用。 您可能已經解析了/Date(1401993000000)/
。
您可以使用Moment JS,這是在JavaSCript中使用datetime的更好方法之一。 很多功能
https://momentjs.com/timezone/
查看已編輯的消息,沒有momentjs:
var data = [ {"id":1,"start":"/Date(1401993000000+0530)/"} ]; var myDate = new Date(data[0].start.match(/\\d+/)[0] * 1); myDate = new Date(myDate.getTime() + myDate.getTimezoneOffset() * 60 * 1000); alert(myDate);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.