如何安全地解析日期HTTP头在javascript



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

在Mozilla的日期条目中。解析,它们写:

给定一个表示时间的字符串,parse()返回时间值。它接受RFC2822/IETF日期语法(RFC2822 Section 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(),我是否"几乎有保证"?为了能够解析程序中的内容?我很高兴地假设服务器不是在时间真空中运行。

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)

如果您需要100%保证跨任何兼容的ECMAScript实现,则需要使用应用程序代码将时间戳转换为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 2000, 1 January 2000, 2000 1 January
  • 月份可以缩写为三个字符(我相信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)

…这就是为什么你几乎保证这些日期可以被解析。

来源:

  • V8: https://github.com/v8/v8-git-mirror/blob/master/test/mjsunit/date-parse.js
  • Mozilla: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/parse
  • WebKit: https://github.com/WebKit/webkit/blob/master/LayoutTests/js/date-parse-test-expected.txt, https://github.com/WebKit/webkit/blob/master/Source/WTF/wtf/DateMath.cpp(多好的命名空间啊!)
  • MSDN: https://msdn.microsoft.com/library/k4w173wk%28v=vs.94%29.aspx

相关内容

  • 没有找到相关文章

最新更新