6

我在 Firefox 暂存器中测试了以下代码并得到了有趣的结果?

var date=new Date("2012-05-12");
var date2 = new Date("05/12/2012");
date;
/*
Fri May 11 2012 17:00:00 GMT-0700 (Pacific Daylight Time)
*/
date2;
/*
Sat May 12 2012 00:00:00 GMT-0700 (Pacific Daylight Time)
*/

两个日期不同。显然这是由于时区问题。我想要的是 date2 结果。如何让 js 引擎正确处理 ISO 日期样式?

4

2 回答 2

2

我认为问题在于字符串“2012-05-12”被视为 ISO 8601 日期,而“05/12/2012”是 RFC 2822 日期。在 ISO 格式中,缺少时区意味着 UTC。在 5 月 12 日凌晨的午夜,在加利福尼亚(或无论您身在何处),是前一天晚上 7 点。

然而,没有时区的 RFC 日期是在您想要本地时区的午夜时间戳的假设下解析的。(好吧,不一定是您的时区;运行 JavaScript 的计算机的时区 :-)

如果将这些字符串传递给Date.parse().

RFC 日期格式可以包含明确的时区,但 ISO 格式不能。(嗯,它可以,但浏览器不注意,显然 IE 根本不处理这些。)

编辑——这是一个简单的(愚蠢的;没有错误检查)函数,它会给你一个来自 3 部分 ISO 表单的日期:

function isoDate( str ) {
  var rv = null;
  str.replace(/^(\d\d\d\d)-(\d\d)-(\d\d)$/, function(_, yr, mn, dy) {
    rv = new Date(parseInt(yr, 10), parseInt(mn, 10) - 1, parseInt(dy, 10));
  });
  return rv;
}
于 2012-06-25T19:38:47.080 回答
0

按照标准,使用Date(),您可以以依赖于实现的方式解析 ISO 日期或依赖于实现的格式的日期。要获得更可靠的信息,请使用可以解析某些已知格式的日期的合适库。

于 2012-06-25T20:29:56.610 回答