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

How to safely parse the Date HTTP header in javascript

提问人:Merc 提问时间:5/24/2015 最后编辑:CommunityMerc 更新时间:5/24/2015 访问量:4917

问:

如果我使用 ,我是否“几乎可以保证”能够解析我的程序中出现的内容?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()

JavaScript http 日期时间

评论

0赞 freakish 5/24/2015
你不应该“能够解析即将到来的内容”,而是“知道你收到的格式并解析它”。什么样的服务器没有一种恒定的日期格式?如果你知道,那有什么问题呢?
1赞 Merc 5/24/2015
哼......你读过我的问题吗?我指着所有的RFC。当你谈论互联网标准时,有很多应该、可以等。我事先不知道我将连接到哪个服务器。
0赞 freakish 5/24/2015
您事先不知道要连接到哪个服务器?这怎么可能?你怎么知道你会得到什么样的响应(json、xml 等)?这对我来说听起来像是一个不真实的问题。每个服务器都是独立实现的。一旦你开始研究真正的实现,你就会发现实际上没有标准这样的东西。
0赞 freakish 5/24/2015
你在写JS框架吗?然后强制服务器使用您想要的格式。就这么简单。
0赞 fny 5/24/2015
@freakish 如果强制服务器在标头中使用不同的格式,则违反了遵循 RFC 7231 的要求。相反,这必须在应用程序代码中的某个位置或通过新的标头来完成。

答:

14赞 fny 5/24/2015 #1

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)

如果您需要在任何合规的 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)

...这就是为什么您几乎可以保证解析这些日期的原因。

来源: