Javascript日期解析错误-6月份的日期失败(?)

Javascript日期解析错误-6月份的日期失败(?),javascript,parsing,date,Javascript,Parsing,Date,我有一些javascript可以解析ISO-8601日期。由于某些原因,它在6月份的日期上失败了。但是7月和5月的约会很好,这对我来说没有意义。我希望有一双新的眼睛会有所帮助,因为我看不出我做错了什么 函数定义(带有bug) 测试代码 输出 2009年5月9日星期六12:30:00 GMT 2009年7月9日星期四格林威治标准时间12:30:00 2009年7月9日星期四格林尼治标准时间12:30:00 更新 感谢您的快速回答,问题在于日期对象最初是今天,恰好是7月31日。当月份设置为6月

我有一些javascript可以解析ISO-8601日期。由于某些原因,它在6月份的日期上失败了。但是7月和5月的约会很好,这对我来说没有意义。我希望有一双新的眼睛会有所帮助,因为我看不出我做错了什么

函数定义(带有bug) 测试代码 输出
  • 2009年5月9日星期六12:30:00 GMT
  • 2009年7月9日星期四格林威治标准时间12:30:00
  • 2009年7月9日星期四格林尼治标准时间12:30:00

更新 感谢您的快速回答,问题在于日期对象最初是今天,恰好是7月31日。当月份设置为6月时,在我更改日期之前,它暂时是6月31日,并向前滚动到7月1日

我发现以下是一个更简洁的实现,因为它一次设置了所有日期属性:

function parseISO8601(timestamp)
{
  var regex = new RegExp("^([\\d]{4})-([\\d]{2})-([\\d]{2})T([\\d]{2}):([\\d]{2}):([\\d]{2})([\\+\\-])([\\d]{2}):([\\d]{2})$");
  var matches = regex.exec(timestamp);
  if(matches != null)
  {
    var offset = parseInt(matches[8], 10) * 60 + parseInt(matches[9], 10);
    if(matches[7] == "-")
      offset = -offset;

    return new Date(
      Date.UTC(
        parseInt(matches[1], 10),
        parseInt(matches[2], 10) - 1,
        parseInt(matches[3], 10),
        parseInt(matches[4], 10),
        parseInt(matches[5], 10),
        parseInt(matches[6], 10)
      ) - offset*60*1000
    );
  }
  return null;
}

因为今天是七月三十一号。格兰特解释了这个问题。我认为这是一个更简单的解决方案。在1月1日初始化日期

var date = new Date(2009,0,1,0,0,0);

日期对象以当前日期开始。 今天是31号,设定2009-06-09给出:

var date = new Date();     // Date is 2009-07-31
date.setUTCFullYear(2009); // Date is 2009-07-31
date.setUTCMonth(6 - 1);   // Date is 2009-06-31 = 2009-07-01
date.setUTCDate(9);        // Date is 2009-07-09

如果您在开始之前将日期设置为1号,那么您应该是安全的。

问题是今天是7月31日

设置时:

var date = new Date();
然后
date.getUTCDate()
是31。当您设置
date.setUTCMonth(5)
(六月)时,您将
date
设置为June 31。因为没有6月31日,JavaScript
Date
对象将其转换为7月1日。因此,在设置调用
date.setUTCMonth(5)
之后,如果您
alert(date.getUTCMonth())它将是
6

这不是六月独有的。在没有31天的任何其他月份的任何月份的31日使用您的函数都会出现相同的问题。在2月的任何月份的29日(非闰年)、30日或31日使用函数也会返回错误的结果

调用
setUTC*()
时,任何滚动都会被正确的值覆盖,这样可以解决以下问题:

var date = new Date();
date.setUTCMilliseconds(0);
date.setUTCSeconds(parseInt(matches[6], 10));
date.setUTCMinutes(parseInt(matches[5], 10) - offset);
date.setUTCHours(parseInt(matches[4], 10));
date.setUTCDate(parseInt(matches[3], 10));
date.setUTCMonth(parseInt(matches[2], 10) - 1);
date.setUTCFullYear(parseInt(matches[1], 10));

这是您更改日期的顺序。 日期从7月31日开始,因此该月的设置失败,因为6月没有31日。(事实上,它正在过渡到7月1日。)

设置全年后,添加以下内容:

date.setYUTCDate(1);
它使它成为每个月都有效的月份的第一个。

看起来像个bug

C:\Documents and Settings\me>java org.mozilla.javascript.tools.shell.Main
Rhino 1.7 release 2 2009 03 22
js> date = new Date();
Fri Jul 31 2009 15:18:38 GMT-0400 (EDT)
js> date.setUTCMonth(5); date.toUTCString();
Wed, 01 Jul 2009 19:18:38 GMT
js> date.setUTCMonth(5); date.toUTCString();
Mon, 01 Jun 2009 19:18:38 GMT

编辑:我想没关系。问题已经由一位更了解情况的人回答。

另外,如果我将日期初始化为
新日期(0)
,它是可以的(因为那是'1970-01-01T00:00:00-00:00')@Kip:是的,使用
新日期(0)
也应该可以解决问题,因为没有任何意外的月末滚动风险。
date.setYUTCDate(1);
C:\Documents and Settings\me>java org.mozilla.javascript.tools.shell.Main
Rhino 1.7 release 2 2009 03 22
js> date = new Date();
Fri Jul 31 2009 15:18:38 GMT-0400 (EDT)
js> date.setUTCMonth(5); date.toUTCString();
Wed, 01 Jul 2009 19:18:38 GMT
js> date.setUTCMonth(5); date.toUTCString();
Mon, 01 Jun 2009 19:18:38 GMT