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

JavaScript: Print previous 12 months -- "March" prints twice?

本文关键字:打印 两次 March 个月 JavaScript      更新时间:2023-09-26

我正在尝试编写一个打印前 12 个月名称的脚本。由于本月是 1 月,因此应打印:12 月十一月十月九月八月七月六月五月四月三月二月一月

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

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

.HTML

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

爪哇语

    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>");       
    }

我做错了什么?

不错的一个!花了我一段时间。

原因是

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

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

那是因为今天恰好是 29 日,当你到达 2 月 29 日时,它将结束到 3 月。

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

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

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

我认为没有任何

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

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

JSFiddle

试试这个 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>");       
}