JavaScript:打印前12个月 – “March”打印两次?

JavaScript: Print previous 12 months — “March” prints twice?

我正在写一个打印前12个月名字的脚本。因为这个月是一月,所以应该打印:十二月十一月十月九月八月七月六月五月四月三月二月一月

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

十一月十月九月八月七月六月五月四月三月三月二月

HTML

1
 

JavaScript

1
2
3
4
5
6
7
8
    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()] +"");      
    }

我做错什么了?


好一个!花了我一段时间。

原因是今天是29号。由于您的日期对象被隐式设置为当前日期,并且2013年2月只有28天,所以您会看到3月打印了两次。通过设置可选的day参数来解决此问题:

1
d.setMonth(d.getMonth() - 1, 1);


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

1
2
3
4
5
var month = new Date().getMonth();

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

(JSFiddle)


那是因为今天正好是29号,到了2月29号,就要到3月了。

将日期设置为第一个(或任何其他小于29的日期),然后它将在所有月份工作:

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

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


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

1
2
3
4
5
6
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] +"");      
}