如何在javascript中安全地解析Date HTTP头

时间:2015-05-24 06:42:53

标签: javascript http date datetime

如果我使用Date.parse(),我是否“几乎可以保证”能够解析我程序中的内容?

Mozilla's entry for Date.parse中,他们写道:

  

给定表示时间的字符串,parse()返回时间值。它接受RFC2822 / IETF日期语法(RFC2822第3.3节),例如“周一,1995年12月25日格林尼治标准时间13:30:00”。

我自己的服务器返回Sun, 24 May 2015 05:37:13 GMT

麻烦是,Wikipedia tells me that the Date header follows the RFC 7131。现在,RFC 7231虽然他们似乎在说同样的话(虽然7231更广泛),但我想知道......

如果我使用Date.parse(),我“几乎可以保证”能够解析我程序中的内容吗?我很高兴地认为服务器没有在时间真空中运行。

1 个答案:

答案 0 :(得分:10)

TL; DR如果你回来了一个符合new or old RFC 7231标准的字符串,它会解析大多数现代浏览器,因为它们都非常相似, 疯狂 灵活的解析规则:

new Date('Sun, 24 May 2015 05:37:13 GMT')
new Date('2015 GMT 24 05:37:13 May')
// => Sun May 24 2015 01:37:13 GMT-0400 (EDT)

如果您需要在任何兼容的ECMAScript实施中获得100%保证,则需要使用应用程序代码将时间戳转换为ISO 8601 format YYYY-MM-DDTHH:mm:ss.sssZ < / p>

请记住,时区可能会根据用户的位置而改变。

ECMAScript仅为日期指定以下格式:

  

ECMAScript定义了基于日期时间的字符串交换格式   简化了ISO 8601扩展格式。格式是   如下: YYYY-MM-DDTHH:mm:ss.sssZ

来源:http://es5.github.io/#x15.9.1.15

关于Date.parse

  

如果String不符合该格式,则该函数可能会掉落   回到任何特定于实现的启发式或   特定于实现的日期格式。

来源:http://es5.github.io/#x15.9.4.2

使用现代浏览器实现,通常适用以下规则:

  • month/day/yearmonth-day-year短日期
  • 月份和日期可以是1或2位数
  • 只有两位数的年份必须为&gt; = 70
  • 对于拼写日期,年月和日可以按任何顺序在任何地方(您稍后会看到我的意思):January 1 20001 January 20002000 1 January < / LI>
  • 月份可以缩写为三个字符(我相信IE允许两个)
  • JavaScript将覆盖一周中无效的日期
  • 小时分钟和秒以冒号分隔:'10:20:30','10:20','10:'有效
  • 您可以在任何地方指定“AM”和“PM”,但如果您错误或多余,则会收到NaN或无效的日期错误
  • 您可以在任何地方指定时区字符串(例如'EST','EDT','GMT')

“Anywhere”真正意味着“任何地方”:你可以混淆组件中的垃圾。以下精神错乱有效,例如......

new Date('PM Jan EST 2015 1 10:00')
new Date('2015 1 10:00 Jan EST PM')
// => Thu Jan 01 2015 10:00:00 GMT-0500 (EST)

...这就是为什么你几乎保证要解析那些日期。

来源: