簡體   English   中英

轉換日期時忽略時區偏移 - javascript

[英]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的其他部分中使用的JavaScriptSerializerDataContractJsonSerializer類中。 然而,它受到了極大的批評 ,並最終棄用了標准的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中可能有一個DateTimeDateTimeKind.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM