将JSON datetime对象转换为JavaScript对象

时间:2011-06-29 13:16:34

标签: javascript json datetime

我的JSON以

的形式返回对象
"/Date(1307514780000+0530)" 

如何将此转换为我的JavaScript日期时间对象? 另外,+0530是什么意思?

1 个答案:

答案 0 :(得分:6)

通过“我的JSON”,我推测你指的是Microsoft ASP.NET传递日期时间对象的方式,而不是像你写的那样,但最后还有一个斜杠:

/Date(1307514780000+0530)/

JSON不支持本机JavaScript Date()类型,因此这实际上是一个简单的JSON字符串,但是微软对它进行了多次攻击并实际发送了这个:

\/Date(1307514780000+0530)\/

即使不需要反斜杠,也允许使用JSON字符串。 (这两个字符串与您的JSON客户端软件相同,但是当Microsoft JScript看到这些反斜杠时,它会将其视为一种特殊结构。而且,是的,这是一个至高无上的黑客。)

符号前面的值(也可以是“ - ”)是自1970-01-01 00:00:00 UTC以来的毫秒数。标志和它后面的值表示演示时区,这不是将值转换为本机JavaScript Date()对象所必需的。符号表示时区是在(+)之前还是在( - )UTC之后,数字的格式为“HHMM”,其中“HH”是小时数,“MM”是分钟数。 (在这种情况下,“+ 0530”与印度标准时间相同的时区偏移,即“IST”。)

使用标准的跨浏览器兼容的JavaScript将其转换为原生的 Date()对象:

function getDateFromAspString(aspString) {
  var epochMilliseconds = aspString.replace(
      /^\/Date\(([0-9]+)([+-][0-9]{4})?\)\/$/,
      '$1');
  if (epochMilliseconds != aspString) {
      return new Date(parseInt(epochMilliseconds));
  }
}

请注意,如果字符串不是ASP.NET日期时间字符串,则此函数不会返回任何内容。您可以将结果与未定义进行比较(===)以查看是否返回了任何内容。

在我的浏览器上,这个调用:

getDateFromAspString("/Date(1307514780000+0530)/").toString()

返回此字符串:

"Wed Jun 08 2011 01:33:00 GMT-0500 (Central Daylight Time)"

另见: