如何有效地计算给定原始日期的连续日期

时间:2012-07-12 12:40:19

标签: javascript date

这是一个系统,它基本上允许您设置给定事件的第一个日期,然后设置重复周期。

EG。我设定了从现在开始的一个星期的日期,即2012年7月19日,所以我知道我必须把猫带出牛奶。我还将其设置为每周通知,因此在未来几周内,我希望收到相同的通知。

原始日期位于我的数据库中,第1周正常,但在第2周我需要将日期作为原始日期加上1周。

从表面上看,这似乎很简单,但我需要确保我能解释闰年和不同的复发频率(每两周,每月,每年,等等)。

我想将此作为javascript实现 - 因为它更快,我觉得可能需要的代码少于更新数据库中的日期。也许这是不可能实现的,任何指针都会很棒。

我认为这些可能是一个起点:

Given a start date , how to calculate number of years till current date in javascript

Given a date, how can I efficiently calculate the next date in a given sequence (weekly, monthly, annually)?

更新,我写了以下内容,以便在每个不同的情况下返回添加的时间,从那里我可以使用下面的答案:

var strDate = $(this).find('.next').text();
            var frequency = $(this).find('.occurs').text();
            var frmDate = getDateObject(strDate);
            var toDate = new Date();

            var days = parseInt(Math.floor((frmDate - toDate) / 86400000));

            if(days < 0) {
                // find out how many WHOLE 'frequencies' have passed
                var weeks = Math.ceil(0 - (days / 7));
                var months = Math.ceil(0 - (monthDiff(toDate,frmDate)));
                var years = Math.ceil(months / 12);
                //alert(days + '/' + weeks + '/' + fortnights + '/' + months + '/' + quarters + '/' + years);

                if(frequency == 'Weekly') { frmDate.add(weeks).weeks(); }
                if(frequency == 'Fortnightly') { frmDate.add(weeks*2).weeks(); }
                if(frequency == 'Monthly') { frmDate.add(months).months(); }
                if(frequency == 'Quarterly') { frmDate.add(months*3).months(); }
                if(frequency == 'Annually') { frmDate.add(years).years(); }

                var newdate = frmDate.toString("dd/MM/yyyy");
                //alert(newdate);

                $(this).find('.next').text(newdate);
            }

3 个答案:

答案 0 :(得分:0)

我会做什么(可能不是最好的解决方案,我现在就提出来)是从初始日期开始并使用循环:while您观察的日期小于当前日期,将观察日期增加一周(两周,一个月,一年等)。如果您在当前日期降落,则会发生事件。否则它将持续一天。

您可以使用date.setDate(date.getDate()+1);之类的内容将日期增加一天,相同+7一周,使用set/getMonthset/getFullYear分别使用数月和年。如果你给出一个超出范围的值,JS将把它包装起来(所以3月32日变成4月1日)

答案 1 :(得分:0)

此外,此实现的SQL实现将使用DATEADD:

http://sql-plsql.blogspot.com/2010/07/dateadd.html

您不必担心像闰年等特殊日期,因为大多数日期功能都会照顾到这一点。

或者,您可以像其他用户建议的那样使用getDate(),getMonth()。       var today = new Date();       today.setDate(today.getDate()+ numberOfDaysToAdd);

答案 2 :(得分:0)

请查看以下代码以获取一些原始想法

    var someDate = new Date();
for(var i = 0 ; i < 7 ; i++)
    {
someDate.setDate(someDate.getDate() + 1);   
        console.log(someDate)
    }

您可以在下面的小提琴中测试相同的内容

Consecutive 7 days from current day