【问题标题】:How to safely parse the Date HTTP header in javascript如何在 javascript 中安全地解析 Date HTTP 标头
【发布时间】:2015-05-24 06:42:53
【问题描述】:

如果我使用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(),我“几乎可以保证”能够解析我的程序中的内容吗?我很高兴假设服务器没有在时间真空中运行。

【问题讨论】:

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

标签: javascript http date datetime


【解决方案1】:

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)

如果您需要 100% 保证任何合规的 ECMAScript 实现,您需要使用您的应用程序代码将时间戳转换为 ISO 8601 formatYYYY-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

如果字符串不符合该格式,函数可能会失败 回到任何特定于实现的启发式或 特定于实现的日期格式。

来源: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”)

“Anywhere”真正的意思是“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)

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

来源:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-11
    • 2013-03-28
    • 2010-09-09
    • 1970-01-01
    • 2021-07-16
    • 1970-01-01
    • 1970-01-01
    • 2011-06-08
    相关资源
    最近更新 更多