将JSON datetime对象转换为JavaScript对象

ram*_*ram 1 javascript datetime json

我的JSON以此形式返回对象

"/Date(1307514780000+0530)" 
Run Code Online (Sandbox Code Playgroud)

如何将其转换为我的JavaScript日期时间对象?还有什么+0530意思呢?

dan*_*ton 6

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

/Date(1307514780000+0530)/
Run Code Online (Sandbox Code Playgroud)

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

\/Date(1307514780000+0530)\/
Run Code Online (Sandbox Code Playgroud)

即使不需要反斜杠,也允许使用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));
  }
}
Run Code Online (Sandbox Code Playgroud)

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

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

getDateFromAspString("/Date(1307514780000+0530)/").toString()
Run Code Online (Sandbox Code Playgroud)

返回此字符串:

"Wed Jun 08 2011 01:33:00 GMT-0500 (Central Daylight Time)"
Run Code Online (Sandbox Code Playgroud)

也可以看看: