我有一个WCF REST服务,在下面的格式返回日期:忽略区偏移量,同时转换日期 - JavaScript的
/Date(1401993000000+0530)/
这个日期在服务器上的值是
6/6/2014 12:00:00 AM
我想用UTC值解析这个javascript代码。
我尝试手动删除“+0530”字符串并解析它到日期,但它给“无效的日期”。
我也尝试添加按照此post的时区偏移量,但它给出的值不正确。
我该如何解析?
我有一个WCF REST服务,在下面的格式返回日期:忽略区偏移量,同时转换日期 - JavaScript的
/Date(1401993000000+0530)/
这个日期在服务器上的值是
6/6/2014 12:00:00 AM
我想用UTC值解析这个javascript代码。
我尝试手动删除“+0530”字符串并解析它到日期,但它给“无效的日期”。
我也尝试添加按照此post的时区偏移量,但它给出的值不正确。
我该如何解析?
您可以使用Moment JS,在JavaSCript中使用datetime更好的方法之一。的功能很多
https://momentjs.com/timezone/
见编辑的消息,而不momentjs:
var data = [ {"id":1,"start":"/Date(1401993000000+0530)/"} ];
\t var myDate = new Date(data[0].start.match(/\d+/)[0] * 1);
\t myDate = new Date(myDate.getTime() + myDate.getTimezoneOffset() * 60 * 1000);
\t alert(myDate);
虽然我同意,但这不是一个真正的答案。只是一个评论。 我建议给OP一个解决他们问题的简单例子。 – evolutionxbox
这给出了错误的结果。它调整主机时区偏移量,以调整所提供的偏移量(即+0530); – RobG
该格式通常被称为一个 “ASP.NET JSON日期” - 因为它首先出现在ASP.NET和.NET其他部分中使用的JavaScriptSerializer
和DataContractJsonSerializer
类中。然而,它是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:00 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中的时间戳,并且没有为r提供一个提供的偏移量。
您当然可以将字符串分解为其部分并自己使用它们,但是可以考虑使用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)/
。
你能解释一下这是如何工作的吗? OP在服务器*上说“* 6/6/2014 12:00:00 AM”,不说什么时区,你也假设它是+0530。 – RobG
@RobG - 扩大我的答案。 LMK如果我错过任何东西。 :) –
哈!失读症再次发作!谢谢 - 修正。 –
这不应该给'无效日期':'新日期(1401993000000)' –
请提供[mcve]。强调_verifiable_。 – evolutionxbox
@ MikaelLennholm - 是的,但OP需要应用偏移+0530。 – RobG