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

时间:2011-06-15 10:13:55

标签: 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);
    }

可以称之为......

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

到目前为止一切都那么好......但是当我将“今天”投射到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

3 个答案:

答案 0 :(得分:34)

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

您应该从不更新与原始Date电话上的对象不同的getDate对象。

示例实施:

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

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


使用不正确:

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

这将根据startDate的值更新a的“日期”值14天。由于a的值与先前定义的startDate不同,因此可能会得到错误的值。

答案 1 :(得分:4)

扩展Exellian的答案,如果你想计算未来的任何时期(在我的情况下,在下一个付款日期),你可以做一个简单的循环:

var today = new Date();
var basePayDate = new Date(2012, 9, 23, 0, 0, 0, 0);

while (basePayDate < today) {
    basePayDate.setDate(basePayDate.getDate()+14);
}

var nextPayDate = new Date(basePayDate.getTime());
basePayDate.setDate(nextPayDate.getDate()-14);

document.writeln("<p>Previous pay Date: " + basePayDate.toString());
document.writeln("<p>Current Date: " + today.toString());
document.writeln("<p>Next pay Date: " + nextPayDate.toString());

假设核心日期服务按预期工作,这不会遇到奇怪的问题。我不得不承认,未来很多年我都没有测试过它......

答案 2 :(得分:2)

注意:我有类似的问题;我想每周创建一系列日期,即,开始日期为10/23/2011,并持续12周。我的代码或多或少是这样的:

var myDate = new Date(Date.parse(document.eventForm.startDate.value));
var toDate = new Date(myDate);

var week = 60 * 60 * 24 * 7 * 1000;
var milliseconds = toDate.getTime();

dateArray[0] = myDate.format('m/d/Y');

for (var count = 1; count < numberOccurrences; count++) {
    milliseconds += week;
toDate.setTime(milliseconds);
    dateArray[count] = toDate.format('m/d/Y');
}

因为我没有指定时间而且我住在美国,我的默认时间是午夜,所以当我越过夏令时边界时,我搬到了前一天。呸。我通过设置我的时间到中午来解决它,然后才进行一周的计算。