微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

获取接下来的 4 个星期四,但如果过了星期日,则排除第一个星期四

如何解决获取接下来的 4 个星期四,但如果过了星期日,则排除第一个星期四

我需要使用 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)));
       
            
        });
    });

解决方法

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

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

我的建议是:

  • 始终创建五个日期
  • 根据天数从数组 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();
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。