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

标签 javascript wcf date datetime

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

/Date(1401993000000+0530)/

这个日期在服务器上的值为

6/6/2014 12:00:00 AM

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

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

我还尝试按照 post 添加时区偏移量但它给出了不正确的值。

我该如何解析?

最佳答案

这种格式通常被称为“ASP.NET JSON 日期”——因为它首先出现于 ASP.NET 和其他应用程序中使用的 JavaScriptSerializerDataContractJsonSerializer 类.NET 的一部分。然而,它是 heavily criticized , 并最终弃用标准 ISO 8601格式,这是 Json.Net 中的默认格式大多数现代 .NET 代码中使用的库。您仍会在 WCF 和旧版本的 ASP.NET MVC 中看到它。

此格式有两个主要变体:

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

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

在显示的两种格式中,时间戳部分旨在表示自 Unix 纪元以来的毫秒数,即 1970-01-01 00:00:00.000 UTC。

我说“预期”,因为在 .NET 中可能有一个 DateTimeDateTimeKind.Unspecified,它不可能映射回 UTC。在这种情况下,序列化程序的行为就好像它具有 DateTimeKind.Local。然后,输出将反射(reflect)调整为计算机本地时区中的 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用于解析此字符串。它 native 理解格式,并可以返回一个保留偏移量知识的对象。

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)/

关于javascript - 转换日期时忽略时区偏移 - javascript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44651562/

相关文章:

.net - 为什么 .net WCF 服务需要接口(interface)

c# - 由于服务操作量大,添加服务引用时出错

java - 在 ORMLite queryRaw 方法中获取两个日期字符串之间的日期时出现 SQLException

android - 编辑文本的触摸事件上的日期选择器对话

javascript - 用户使用 Javascript 输入动态表

javascript - React - 无法访问有状态组件事件处理程序中的引用

javascript - 如果类别下没有任何子类别,则应隐藏该类别

javascript - 正则表达式测试并将结果存储在 javascript 中

wcf - 以编程方式添加 IOperationBehavior 的正确位置在哪里

oracle - 时区的 Oracle 日期格式掩码是什么?