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

Mer*_*erc 12 javascript datetime date http

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

Mozilla的Date.parse条目中,他们写道:

给定表示时间的字符串,parse()返回时间值.它接受RFC2822/IETF日期语法(RFC2822第3.3节),例如"Mon,25 Dec 1995 13:30:00 GMT".

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

麻烦的是,维基百科告诉我,Date标题遵循RFC 7131.现在,RFC 7231虽然他们似乎在说同样的事情(虽然7231更广泛),但我想知道......

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

fny*_*fny 10

TL; DR如果您要回到新的或旧的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)
Run Code Online (Sandbox Code Playgroud)

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

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


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/year,month-day-year短期约会
  • 月和日可以是1或2位数
  • 只有两位数的年份必须> = 70
  • 对于规定了日期的年月日之间可以按任意顺序排列的任何地方(你会看到我所说的任何地方后来平均值): ,,January 1 20001 January 20002000 1 January
  • 月份可以缩写为三个字符(我相信IE允许两个)
  • JavaScript将覆盖一周中无效的日期
  • 小时分钟和秒由冒号分隔:'10:20:30','10:20','10:'有效
  • 您可以在任何地方指定"AM"和"PM",但如果您错误或多余,您将获得NaN或无效的日期错误
  • 您可以在任何地方指定时区字符串(例如'EST','EDT','GMT')

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

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)
Run Code Online (Sandbox Code Playgroud)

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

资料来源: