【问题标题】:Javascript new date treats differently towards different date style?Javascript 新日期对不同日期样式的处理方式不同?
【发布时间】:2012-06-27 02:16:41
【问题描述】:

我在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 日期样式?

【问题讨论】:

  • 删除第一个示例中的前导零。 var date=new Date("2012-5-12");
  • @j08691 会导致“日期无效”错误,至少在 Firefox 中是这样。
  • @Pointy - 很好,我在 Chrome 中测试过。
  • 在 IE8 中我得到:LOG: NaN LOG: Sat May 12 00:00:00 UTC-0300 2012

标签: javascript html date


【解决方案1】:

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

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

如果您将这些字符串传递给Date.parse(),您会看到差异。

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

edit — 这是一个简单的(愚蠢的;没有错误检查)函数,它会为您提供来自该 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;
}

【讨论】:

  • 是的,您的回答实际上就是我的想法。但是有什么解决方案...?
  • @NSF 好吧,您可以自己解析 ISO 日期格式,然后显式构造日期。如果你用数字构造一个日期,它应该采用本地时区。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多