转换日期时忽略时区偏移 - javascript

时间:2017-06-20 11:16:08

标签: javascript wcf date datetime

我有一个WCF REST服务,它以下面的格式返回日期:

/Date(1401993000000+0530)/

服务器上此日期的值为

6/6/2014 12:00:00 AM

我想在UTC值的javascript代码中解析它。

我尝试手动删除“+0530”字符串并将其解析为日期,但它提供“无效日期”。

我还尝试按照此post添加时区偏移量,但它提供的值不正确。

我该如何解析这个?

2 个答案:

答案 0 :(得分:2)

这种格式通常被称为“ASP.NET JSON日期” - 因为它首先出现在ASP.NET和.NET的其他部分中使用的JavaScriptSerializerDataContractJsonSerializer类中。但是,它是heavily criticized,并且最终不赞成使用标准ISO 8601格式,这是大多数现代.NET代码中使用的Json.Net库中的默认格式。你仍然可以在WCF和旧版本的ASP.NET MVC中看到它。

此格式有两个主要变体:

  • /Date(1401993000000)/ - 仅限时间戳
  • /Date(1401993000000+0530)/ - 带偏移量的时间戳

您偶尔会看到使用反斜杠转义的正斜杠,如\/Date(1401993000000)\/中所示,具体取决于它的生成方式。解析器应该容忍这一点,但不应该依赖它。

在所示的两种格式中,时间戳部分用于表示自Unix纪元以来的毫秒数,即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)/

答案 1 :(得分:0)

您可以使用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);