使用标记日计算一天前进两周

时间:2015-11-18 18:16:15

标签: javascript jquery date

我正在尝试编码在给定日期后两周下降的星期四的日期。它比在给定日期添加14天更复杂。

这是因为如果在给定日期周之后的第一个星期三是开始日期,那么在星期四之后的两周后,将超过14天,其中跳过声明日期的星期四。

我认为它应该是一个使用

的JavaScript函数

//变量将保存当前日期 var today = new Date();

//变量将保存当天的数字(例如星期三= 3)。 var thisDay = today.getDay();

然后我将它放在if语句中的“thisDate”变量中。

为了清楚起见,我试图以开始日期是给定变量的方式使用此代码。然后我计算了2周之后,跳过宣布日期的那一周。

5 个答案:

答案 0 :(得分:4)

使用moment.js你可以这样做:

moment().add(2, 'weeks').startOf('isoweek').add(3, 'days');

演示 http://jsfiddle.net/n20vncp0/

答案 1 :(得分:1)

您可以添加14天,然后添加星期四(4)和当前星期几之间的差异。这是fiddle

var date = new Date();
date.setDate(date.getDate() + 14 + (4 - date.getDay() + 7) % 7);

答案 2 :(得分:0)

我认为这就是你想要的。我这里有一个函数,用于计算您想要的前几周数,然后是指定数周后的一周中的目标日。

我正在使用moment.js。

在这里查看JSfiddle:https://jsfiddle.net/Ravvy/ea1u903k/1/

$(document).ready(function () {

    var dateOfNextTwoThursdays = getDateAfterWeeks(2, 'Thursday');
    $('#dateOfNextTwoThursdays').text(dateOfNextTwoThursdays);

    function getDateAfterWeeks(numberOfWeeks, dayString) {
        if (!numberOfWeeks || numberOfWeeks < 1 || !dayString)
            return null;
        if (dayString != 'Monday' && dayString != 'Tuesday' && dayString != 'Wednesday' && dayString != 'Thursday' && dayString != 'Friday' && dayString != 'Saturday' && dayString != 'Sunday')
            return null;

        var weeksFromNow = moment().add('days', numberOfWeeks * 7);
        var dayOfTheWeek = weeksFromNow.format('dddd');

        if (dayOfTheWeek === dayString)
            return weeksFromNow;
        else {
            while (dayOfTheWeek != dayString) {
                weeksFromNow = weeksFromNow.add('days', 1);
                if (weeksFromNow.format('dddd') === dayString)
                    return weeksFromNow;
                dayOfTheWeek = weeksFromNow.format('dddd');
            }
        }
    }
});

答案 3 :(得分:0)

为什么不跳到下周然后循环几天(每次加一个)直到你星期四降落?

function getNextThursday(current){
    if(!current){
        var current = new Date();
    }
    var newday = new Date(current.getTime() + (86400000 * 8)); // next week plus 1 day in ms
    while(newday.getDay() != 4){
        newday = new Date(newday.getTime() + 86400000);
    }
    return newday;
}
var nextThursday = getNextThursday();

答案 4 :(得分:-1)

因此,如果您在DesiredWeekday中有所需的工作日,那么请执行此操作(jsfiddle here):

var DesiredWeekday = 4; // this is Thursday
var GivenDate = new Date();
alert(GivenDate.toString());

// This gives you the desired weekday but makes sure that it is at least two weeks after the given date
var TwoWeeksAfterNextOccurrenceOfDesiredWeekday = new Date();
TwoWeeksAfterNextOccurrenceOfDesiredWeekday.setDate(GivenDate.getDate() + (DesiredWeekday - GivenDate.getDay() + 7) % 7 + 14);
alert("two weeks after next thursday is = " + TwoWeeksAfterNextOccurrenceOfDesiredWeekday.toString());

// This gives you the desired weekday for the week after next week.
var DesiredWeekdayOfWeekAfterNextWeek = new Date();
DesiredWeekdayOfWeekAfterNextWeek.setDate(GivenDate.getDate() + DesiredWeekday - GivenDate.getDay() + 14);
alert("Thursday of Week after next is = " + DesiredWeekdayOfWeekAfterNextWeek.toString());

根据您的最新评论,您似乎想要的是这两种方法中的第一种。让我解释第一种方法的理论,因为它可以用于月度重现的事情,你想要计算这个月的第一个星期五或第三个星期二等等。

在您的情况下,您的想法是,在您给定(或输入)日期之后,您需要从下周四开始两周。所以,首先,我们必须搬到下周四。假设给定日期是星期二。要移至下周四,我们必须添加两天,即周四的工作日数(4)与您给出日期的工作日数(周二为2)之间的差异。如此简单,我们只是在给定日期添加所需工作日和给定日期工作日之间的差异。所以我们到目前为止的公式是:

Calculated Date = Given Date + (Desired weekday - Given Date's weekday)

但是,如果我们的给定日期是在所需的工作日之后,我们就会遇到问题。假设我们的给定日期是星期五,并且我们想要移动到下周四,如果我们添加该差异,则差异将是:期望的工作日(星期四:4) - 给定日期的工作日(星期五:5)。这是-1,我们不想回到上周四,我们想要进入下周四,所以我们要增加一周。这将我们带到:

Calculated Date = Given Date + (Desired weekday - Given Date's weekday + 7)

但回到我们的情况,即给定日期的工作日在所需的工作日之前。如果我们的给定日期是星期二,并且我们在此公式中添加7,我们将增加9天并且将进入下一周的星期四,而不是下周四。那么如果总数超过7,我们如何防止增加7呢?或者,如果总数超过7,我们如何取出7?答案是模数运算符:

Calculated Date = Given Date + ((Desired weekday - Given Date's weekday + 7) % 7)

在给定日期之后的第一个星期四。现在,如果你想要两个星期之后,那么就加上14,就像这样:

Calculated Date = Given Date + ((Desired weekday - Given Date's weekday + 7) % 7) + 14

或在javascript中

CalculatedDate = GivenDate.setDate(GivenDate.getDate() + (DesiredWeekday - GivenDate.getDay() + 7) % 7 + 14);