问题描述
我需要使用 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();
}