简单的javascript日期数学...不是真的

use*_*301 14 javascript math date

我正在尝试创建一个简单的脚本,根据2011年7月6日星期三开始的双周计划为我提供下一个回收日期.所以我创建了这个简单的函数...

    function getNextDate(startDate) {
        if (today <= startDate) {
            return startDate;
        }
        // calculate the day since the start date.
        var totalDays = Math.ceil((today.getTime()-startDate.getTime())/(one_day));
        // check to see if this day falls on a recycle day 
        var bumpDays = totalDays%14;  // mod 14 -- pickup up every 14 days...
        // pickup is today
        if (bumpDays == 0) {
            return today;
        }
        // return the closest day which is in 14 days, less the # of days since the last
        // pick up..
        var ms =  today.getTime() + ((14- bumpDays) * one_day);
        return new Date(ms);
    }
Run Code Online (Sandbox Code Playgroud)

并可以称之为......

 var today=new Date();
 var one_day=1000*60*60*24;  // one day in milliseconds
 var nextDate = getNextDate(new Date(2011,06,06));
Run Code Online (Sandbox Code Playgroud)

到目前为止一切都那么好......但是当我将"今天"投射到2011年10月27日时,我将于2011年11月11日星期二作为下一个日期而不是2011年11月9日星期三...事实上每天都是从现在开始通过10/26/2011预测正确的接送......并且从2011年10月27日至2012年2月28日的每个日期都是星期二而不是星期三.然后每个日期从2012年2月29日(闰年)到2012年10月24日(10月再次),正确地预测周三.我错过了什么?任何帮助将不胜感激..

V

Exe*_*ian 35

最简单的方法是Date使用更新对象setDate.由于此答案的评论表明这不是规范的正式部分,但它在所有主流浏览器上都受支持.

你应该永远不会更新不同的Date对象比你原来的一个getDate随叫随到.

示例实施:

var incrementDate = function (date, amount) {
    var tmpDate = new Date(date);
    tmpDate.setDate(tmpDate.getDate() + amount)
    return tmpDate;
};
Run Code Online (Sandbox Code Playgroud)

如果您尝试增加日期,请使用此功能.它将接受正面和负面的价值观.它还保证不更改使用的日期对象.这样可以防止在您不希望更新更改对象值时可能发生的任何错误.


使用不正确:

var startDate = new Date('2013-11-01T11:00:00');
var a = new Date();
a.setDate(startDate.getDate() + 14)
Run Code Online (Sandbox Code Playgroud)

这将根据值更新startDate14天的"日期"值a.因为a先前定义的值不相同,startDate所以可能得到错误的值.

  • 这是一个非常危险的思考过程.想象一下'startDate'是在这个月的第一天,今天是第31个.你想要一个从startdate回来7天的日期.a.setDate(startDate.getDate() - 7)就足够了吧?没那么快.'a'现在是*当前*月开始前7天,而不是'startDate'之前7天.考虑到Google结果中此页面的出现位置,这一点非常重要.我现在正在纠正这样的问题,并强烈怀疑我们的承包商找到了这个页面,并遵循了这个确切的逻辑. (7认同)