提问人:Merc 提问时间:5/24/2015 最后编辑:CommunityMerc 更新时间:5/24/2015 访问量:4917
如何在 javascript 中安全地解析 Date HTTP 标头
How to safely parse the Date HTTP header in javascript
问:
如果我使用 ,我是否“几乎可以保证”能够解析我的程序中出现的内容?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()
答:
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 2000
1 January 2000
2000 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)
...这就是为什么您几乎可以保证解析这些日期的原因。
来源:
- 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
上一个:如何在 Web 应用程序中显示 HTML 电子邮件?
下一个:模块化编程和节点
评论