JavaScript:打印前12个月 - " 3月"打印两次?

时间:2015-01-29 19:40:46

标签: javascript

我正在尝试编写一个打印前12个月名称的脚本。由于这个月是1月,它应该打印:12月 十一月 十月 九月 八月 七月 六月 可以 四月 游行 二月 一月

相反,它打印三月两次。 http://jsfiddle.net/h69gm04g/2/

十一月 十月 九月 八月 七月 六月 可以 四月 游行 游行 二月

HTML

    <div id="test"></div>

的Javascript

    monthNames = [ "January", "February", "March", "April", "May", "June","July", "August", "September", "October", "November", "December" ];
    d = new Date();

    for (i = 0; i < 12; i++) {  
        d.setMonth(d.getMonth() - 1);      
        monthName = monthNames[d.getMonth()];       
        $('#test').append(monthNames[d.getMonth()] + "<br>");       
    }

我做错了什么?

4 个答案:

答案 0 :(得分:14)

好的一个!花了我一会儿。

原因是今天是29日。由于您的日期对象被隐式设置为当前日期,并且二月份仅二月有28天,因此您会看到三月打印两次。通过设置可选的day参数:

来解决此问题
d.setMonth(d.getMonth() - 1, 1);

答案 1 :(得分:3)

那是因为今天恰好是第29届,当你到了2月29日时,它将结束进入游行。

将日期设置为1(或任何其他小于29的日期),然后它适用于所有月份:

d = new Date();
d.setDate(1);
d.setMonth(d.getMonth() - 1);

演示:http://jsfiddle.net/h69gm04g/3/

答案 2 :(得分:3)

我认为在每次迭代中操作Date对象的答案没有任何理由。一旦我们知道当前月份,我们需要做的就是向后迭代列表,最后回合。这是%的工作。不幸的是,%没有执行真正的数学mod操作,并且可以返回负值,因此最简单的实现是通过向其添加额外的12来确保该值为正:

var month = new Date().getMonth();

for (i = 1; i <= 12; i++) {
    $('#test').append(monthNames[(12 + month - i) % 12] + "<br>");            
}

(的 JSFiddle

答案 3 :(得分:1)

试试这个http://jsfiddle.net/oLp9hegk/

monthNames = [ "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" ];

m = (new Date()).getMonth();
for (var i = 0; i < 12; i++) {
    $('#test').append(monthNames[(m-i+11)%12] + "<br>");       
}