Date.getMonth()方法有bug吗?

时间:2013-02-04 04:32:12

标签: javascript

我在chrome和firefox中测试过,这就是问题所在。 Date对象的getMonth()方法有Bug吗? 当我在someDay上设置位置日期时,例如"2013-1-31"

然后,js代码是:

var d = new Date();
d.setMonth(8);
d.getMonth();

结果是“9”,为什么?

我发现当月有31天时,运行setMonth方法,而getMonth方法将返回错误的值

为什么?

9 个答案:

答案 0 :(得分:71)

getMonth()方法根据当地时间返回指定日期的月份(从0到11)。

注意:1月为0,2月为1,依此类推。

答案 1 :(得分:38)

让我们打破这个:

var d = new Date(); // date is now 2013-01-31
d.setMonth(1);      // date is now 2013-02-31, which is 3 days past 2013-02-28
x = d.getMonth();   // what to do, what to do, 3 days past 2013-02-28 is in March
                    // so, expect x to be March, which is 2

d的日期值大于传递给setMonth()的月份的最大天数时,这只是一个问题。否则,它会按照您的预期运作。

答案 2 :(得分:11)

最简单的解决方案是向setMonth添加第二个参数:

var d = new Date();
d.setMonth(8,1);
d.getMonth(); //outputs 8

http://www.w3schools.com/jsref/jsref_setmonth.asp

  

Date.setMonth(月,日)

     

天:可选。表示预期月份日期的整数   值为1-31,但允许使用其他值:

     

0将导致上个月的最后一天   -1将导致前一个月的最后一天前一天如果该月有31天:

     如果月份为30,那么

32将导致下个月的第一天   天:

     

32将导致下个月的第二天

答案 3 :(得分:8)

JavaScript中的月份代表0-11。第1个月是2月只有28/29天,所以当你将月份设置为1时,它会尝试将日期自动更正为3月,以便建立一个有意义的日期(自2月31日起,没有意义)。通过使用toDateString函数来尝试看看我的意思:

 var d = new Date('2013/01/31');
 d.setMonth(2);
 console.log(d.toDateString()); // outputs Match 3rd, 2013

或许有点奇怪,但不是马车。

答案 4 :(得分:6)

getMonth()方法根据当地时间返回指定日期的月份(从0到11),例如。 1月是0,2月是1。

答案 5 :(得分:5)

在javascript月份从0开始。假设今天是02/04/2012,当你setMonth(1)它将尝试设置为feb。由于feb的最大日期为28/29,因此移至下个月(3月,即2)

答案 6 :(得分:0)

这里的setMonth不是你所期望的,更好的库中会发生什么。 如果将日期31.x.yyyy设置为x + 1,则下个月(x + 1)可能不会有31天。所以31.x + 1.yyyy将改为1.x + 2.yyyy。

在这种情况下,月份将增加2 - 完全改变的日期。

我在改变2月和3月的时候遇到了这个问题,感谢上帝,这只是一个考验。

答案 7 :(得分:0)

这与当前本地日期有关,即使您设置的日期是过去还是将来(假设您正确使用月份范围0-11)。这是因为初始化Date()时,它正在使用当前日期。当您使用setFullYear(),setMonth()或setDate()修改日期时,默认的"当前"价值仍然存在,可以改变日期。

如果您当月(今天)是当月的第31天,然后使用setMonth()设置过去的日期,setDate()其中月份少于当前的31天,则日期( )即使您明确说明,也会给您错误的月份。这是因为当你setMonth()时,当前日期值31(在您设置的月份中不存在)会将其推送到下个月。然后,当您设置日期时,月份永远不会改变。

如果您设置月份之前的月份日期 - setDate(),setMonth(),这可以解决问题,但还有其他类似的问题/错误。如果您当前的月份只有30天,并且您尝试设置的日期为31天,则会将月份日期设置为1而不是31.如果您在当天之前设置月份,则会解决此问题 - setMonth (),setDate(),但是你又回到了第一个问题。

<强>解决方案:

  1. 获取值,然后同时设置月份和月份的日期(如建议的reetah) - setMonth(8,1)
  2. 使用可选值设置年份以初始化setFullYear(1972,0,1),然后设置setMonth,setDate。
  3. 设置月份,设置日期,然后验证月份等于您的月份 设置它并重新设置它,如果不是 - setMonth(),setDate(),setMonth()
  4. &#13;
    &#13;
    function formatDate(date) {
      var monthNames = [
        "January", "February", "March",
        "April", "May", "June", "July",
        "August", "September", "October",
        "November", "December"
      ];
    
      var day = date.getDate();
      var monthIndex = date.getMonth();
      var year = date.getFullYear();
    
      return day + ' ' + monthNames[monthIndex] + ' ' + year;
    }
    
    var date = new Date();
    if (date.getDate() < 31) {
    	$("#mydate").text("YOUR LOCAL DATE (on your computer) MUST BE SET TO THE 31st for this bug to show.");
    } else {
      date.setFullYear(1972);
      date.setMonth(8); // (month-1)
      date.setDate(24);
      var breakdown = "<br>Day: " + date.getDate() + "<br>Month: " + date.getMonth() + "<br>Year: " + date.getFullYear();
      $("#mydate").html("Set as September (8)<br><br>" + formatDate(date) + breakdown);
    
      var date = new Date();
      date.setFullYear(1972);
      date.setMonth(8, 24); // (month-1)
      var breakdown = "<br>Day: " + date.getDate() + "<br>Month: " + date.getMonth() + "<br>Year: " + date.getFullYear();
      $("#mydate4").html("Set as September (8) but set day before month<br><br>" + formatDate(date) + breakdown);
    
      date.setFullYear(1972);
      date.setMonth(9); //October (month-1)
      date.setDate(24);
      var breakdown = "<br>Day: " + date.getDate() + "<br>Month: " + date.getMonth() + "<br>Year: " + date.getFullYear();
      $("#mydate2").html("Set as October (9)<br><br>" + formatDate(date) + breakdown);
    
      var date = new Date();
      date.setFullYear(1972);
      date.setMonth(7); //Aug (month-1)
      date.setDate(24);
      var breakdown = "<br>Day: " + date.getDate() + "<br>Month: " + date.getMonth() + "<br>Year: " + date.getFullYear();
      $("#mydate3").html("Set as August (7)<br><br>" + formatDate(date) + breakdown);
    }
    &#13;
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    September 1972 has only 30 days.  If your current local day is 31, the Date will return October 1972 when you specify September before you specify the day of the month.
    <br><br><div id="mydate" style="color: red;">
    </div>
    <br><br>
    <div id="mydate4">
    </div><br><br>
    <div id="mydate2">
    </div>
    <br><br>
    <div id="mydate3">
    </div>
    &#13;
    &#13;
    &#13;

答案 8 :(得分:-2)

我刚刚解决了这个问题:

实施例

var d = new Date('2013/01/31');

m = d.getMonth();

month = m*100/100 + 1;

Var month包含正确的值。