0

我需要使用 javascript 获取接下来的 4 个星期四,并将结果附加到选择框中,但如果当前日期已超过星期日,则不要获取第一个星期四(一周后开始)。

例如:


当前日期 = 2021 年 6 月 12 日星期六

获取接下来的 4 个星期四:2021 年 6 月 17 日、2021 年 6 月 24 日、2021 年 7 月 1 日、2021 年 7 月 8 日。


当前日期 = 2021 年 6 月 15 日,星期二 - 不要得到 2021 年 6 月 17 日,因此列表为:

2021 年 6 月 24 日、2021 年 7 月 1 日、2021 年 7 月 8 日、2021 年 7 月 15 日。


我最初有一些代码可以得到 X 个月的星期四,但这并不是我想要的,因为它在一个月内得到所有星期四,而不是接下来的 4 个星期四。我猜我可以重用获取星期几代码,并将其修改为仅获取接下来的 4 天……然后以某种方式过滤日期是否已超过星期日?

function getNextMonths(num) {

    let current = new Date();
    let months  = [];

    for (let i = 0; i <= num; i++) {

        let next = new Date();

        next.setDate(1); // First day... 
        next.setMonth(current.getMonth() + i); //...of next month

        months.push(next);
    }

    return months;
}

function getDayOfWeek(num_week_day, dates) {

    let days = [];

    var today = new Date();

    for (let i = 0; i < dates.length; i++) {

        // Evaluate current month
        
        let current = {

            year: dates[i].getFullYear(),
            month: dates[i].getMonth()
        };

        current.days = new Date(current.year, current.month + 1, 0).getDate();
        
        // Loop & evaluate days 
        
        for (let d = 1; d <= current.days; d++) {

            let date = new Date(current.year, current.month, d);

            if (date.getDay() == num_week_day) {
                if(date.getTime() > today.getTime()){
                    days.push(date);
                }
            }
        }
    }

    return days;
}

//Convert to Nice looking Date
function dateToString(date){
    return date.toLocaleDateString("en-GB", { 
    dateStyle: 'full'
    });
}

//Output date as mm/dd/yyyy for ouput value
function dateToValue(date){
return date.toLocaleDateString("en-GB", { 
  year: "numeric",
  month: "short",
  day: "numeric",
});
 
}

// Get all Thursdays (4th day of the week) within the next 2 months.

    var select = document.getElementById("arr");
    var elmts = getDayOfWeek(4, getNextMonths(1));

    // Main function
    jQuery( document ).ready(function() {

        jQuery('#sub_start_date').find('option').remove();

        jQuery.each(elmts, function(i, p) {
            
                jQuery('#sub_start_date').append(jQuery('<option></option>')
                        .val(dateToValue(p)).html(dateToString(p)));
       
            
        });
    });
4

1 回答 1

0

在我看来,您的代码不完整,因此我无法在自己的环境中运行。我给你的建议虽然很简单:

您将日期存储在一个数组中elmts,然后循环遍历它以创建所有选项元素。

我的建议是:

  • 始终创建五个日期
  • 取决于 daynumber 从 array 中删除第一个或最后一个条目elmts。Javascript为此提供了两种方法:

该方法.shift()从数组中删除第一个元素(另请参见https://www.w3schools.com/jsref/jsref_shift.asp)。

该方法.pop()从数组中删除最后一个元素(另请参见https://www.w3schools.com/jsref/jsref_pop.asp)。

基于https://gomakethings.com/how-to-get-the-date-for-a-specific-day-of-the-week-with-vanilla-js/

我的代码:

/* Some nassecary preconditions */
var datebase = new Date();
var targetDaynumber = 4;
var currentDiff = new Date().getDay();

/* Calculates a timestamp based on your wished weekday */
var getNextDay = function (basedate) {

    // The current day
    var now = basedate.getDay();

    var diff = targetDaynumber - now;
    diff = diff < 1 ? 7 + diff : diff;

    // Get the timestamp for the desired day
    var nextDayTimestamp = basedate.getTime() + (1000 * 60 * 60 * 24 * diff);

    // Get the next day
    return new Date(nextDayTimestamp);
};
/* ------------------------------------------------- */

/* Creating five timestamps */
var dateArray = [];
var loopindex = 5;
for (x = 0; x < loopindex; x++)
{
    datebase = getNextDay(datebase);
    dateArray.push(datebase);
}

/* Calculating the timegap */
if (currentDiff <= targetDaynumber) {
    //Timegap is too small, remove the earliest timestamp
    dateArray.shift();
} else {
    //Timegap is ok, the fith element is not nassecary
    dateArray.pop();
}
于 2021-06-15T13:24:49.803 回答