【问题标题】:javascript add value monthjavascript 增值月份
【发布时间】:2014-06-01 15:17:08
【问题描述】:

我正在创建一个系统,我需要每个月为一个变量添加一个值。例如,去年一月我有 5 个假期,每个月我需要增加 1 个假期。细分将是这样的: 一月 = 5 片叶子 二月 = 6 片叶子(这个月我用完了 2 片叶子,剩下 4 片叶子) 三月 = 5 片叶子 四月 = 6 片叶子 以此类推。

我将采用什么方法或如何实现它?

非常感谢!!

【问题讨论】:

  • 听起来你想把它存储在某个地方?你有没有尝试过任何东西?

标签: javascript html date


【解决方案1】:

我在将月份添加到日期时使用它并且我不想溢出月份:

function addMonthsNoOverflow(dateParam, intParam) {
    var sum = new Date(new Date(dateParam.getTime()).setMonth(dateParam.getMonth() + intParam);
    if (sum.getDate() < dateParam.getDate()) {  sum.setDate(0);  }
    return(sum);
}

注意事项:

它通过消除溢出来处理 29、30 或 31 变成 1、2 或 3 的情况

月份不是零索引,因此 .setDate(0) 是上个月的最后一天。

【讨论】:

    【解决方案2】:

    如果只是计算,那么您可以通过 d.setMonth(d.getMonth() + 1) 添加月份。这使得 Date 完成了计算每个月有多长的所有麻烦事。

    var initial_value = 5,
        initial_date = new Date(2014, 0, 1), // January
        end_date = new Date(2014, 3, 1);     // April
    
    var spent = 2;
    
    var value = initial_value,
        date = new Date(initial_date);
    while (date.setMonth(date.getMonth() + 1), date <= end_date)
        value += 1;
    
    value -= spent;
    
    value; // 6
    

    此方法适用于每月 &lt; 29 的几天,对于 29 &lt;= x &lt;= 31 的几天,您将需要额外检查
    即检查到那时它改变了多少个月,如果不是1,在这些情况下你想要什么行为?


    如果你总是想要一个月的最后一天,那么它只比上面长几个步骤,

    d.setDate(1);                 // go to a "safe day" to change months
    d.setMonth(d.getMonth() + 2); // go 2 months forward
    d.setDate(0);                 // roll back to the last day of the previous month
    

    我一直在玩的一些额外的东西

    var dates = (function () {
        function isLeapYear(year) {
            if (year % 4)   // not divisible by 4
                return false;
            if (year % 100) // not divisible by 100
                return true;
            if (year % 400) // not divisible by 400
                return false;
            return true;
        }
        return {
            year: new Date().getUTCFullYear(),
            get leapYear() { return isLeapYear(this.year); },
            isLeapYear: isLeapYear,
            get total() { return 365 + isLeapYear(this.year); },
            0: 31,
            get 1() { return 28 + isLeapYear(this.year); },
            2: 31,
            3: 30,
            4: 31,
            5: 30,
            6: 31,
            7: 31,
            8: 30,
            9: 31,
            10: 30,
            11: 31
        };
    }());
    

    【讨论】:

    • 感谢您的回答!但是,我想要实现的是每个月在 initial_value 上加 1。对不起,如果我感到困惑。假设initial_value是5,10个月后应该是15。
    • This makes Date do all the messy stuff of working out how long each month is。并非在所有情况下:使用上述方法将一个月添加到 5 月 31 日。你会得到 7 月 1 日。
    • 我现在明白了。谢谢!!
    • @RobG 没错,即使您尝试在月份编号上“加一”,这也是正确的值,因为没有 6 月 31 日。这也是我在代码中使用每个月的第一天的原因。
    • @user3545006 如果您从每个月的x &gt;= 29th 开始,您可能希望添加另一个检查,以便在天数超出月数时进行更正
    猜你喜欢
    • 1970-01-01
    • 2018-04-05
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 2014-11-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多