如何在 JavaScript 中获取一周中某一天最接近的日期?



我试图从一周中的某一天获取 k 个最接近日期的列表,但我不知道怎么做。有人可以给我一个提示或建议吗?谢谢。

例如:

getDates(k, day) { .... } // k is number of dates (1,2,3 etc), day is day of the week ("monday", "tuesday" etc)
// today is 05/19/2020
getDates(1, "monday") // output: [05/25/2020]
getDates(2, "monday") // output: [05/25/2020, 06/01/2020]

我相信您已经从所有评论中弄清楚了如何解决这个问题。所以我只发布我的答案,给出我个人对这个问题的方法。

我很确定不使用以下方法很难解决这个问题:

1:天到数字转换器(星期日=>0,星期一=>1,依此类推... 这是因为Date.prototype.getDay返回一个数字,而不是在 词形(

2:日期添加功能(因为有几个日期添加 我们无法避免的(一个用于决定一周中最近的一天,另一个用于为输出数组创建新日期(,最好将其设为函数。

我的方法是(虽然没有完全优化(:

1:首先,将输入日期转换为整数形式。这可以在 几种方法,但我只是创建了一个日期数组,并使用了indexOf获取日期数字的方法。但还有另一种巧妙的方法, 这对您居住的任何地区都是灵活的(此 SOF 链接的应用(。

2:然后,使用天day从当前时间获取最近的日期 (中间的 while 循环(。我认为它很容易阅读,但我们可以在这里使用一个衬垫。这看起来像new_day.setDate(new_day.getDate() + (day_num - first_day.getDay() + (7 * (new_day.getDay() > day_num))));.但我个人觉得这是一个 有点讨厌,所以我更喜欢循环方法。

3:最后,创建日期数组。在我的代码中,我首先创建了 k项的空数组(不fill(),数组将被[empty, empty...]并且不可迭代(,然后将它们映射到相应的 计算日期。

不过,我的方法实际上有一个缺点。转换时 表单的日期对象MM/DD/YYYY,我正在使用toLocaleDateString方法。但显然,使用toLocaleDateString()是有风险的(请参阅此 SOF 的评论 答案(,我不太确定为什么,但如果是这样,那将是一个 问题。

此外,输出5/25/2020,而预期输出05/25/2020.这取决于您的期望,但这可能是一个 问题。

function addDays(date, day) {
let new_date = new Date(date.getTime());
new_date.setDate(new_date.getDate() + day);
return new_date;
}
function getDates(k, day) {
const day_num = ['sunday', 'monday', 'tuesday', 'wednesday' ,'thursday' ,'friday', 'saturday'].indexOf(day.toLowerCase()) // converting day name to number
let new_day = new Date();
while (new_day.getDay() !== day_num) {
new_day = addDays(new_day, 1)
}

return Array(k).fill().map((_, index) => addDays(new_day, index * 7).toLocaleDateString() )
}
// today is 05/19/2020
console.log(getDates(1, "monday")) // output: [05/25/2020]
console.log(getDates(2, "monday")) // output: [05/25/2020, 06/01/2020]
console.log(getDates(10, "monday"))
console.log(getDates(20, "monday")) // also for k > 10

希望有帮助,干杯! :)

正如注释所建议的那样,您可以将提供的日期移动到所需日期的下一个实例,然后继续添加 7 天,直到获得所需的日期数。

在下面的函数中,如果开始日是星期一,当前日期也是星期一,则结果数组中的第一个日期是当天。如果您希望它是下周,请更改:

dateDay > idx?

dateDay >= idx?

我认为该函数应该返回一个日期数组,然后调用者可以根据需要格式化它们。

/**
* Get array of count date stings from next dayName starting on or after today or d
* @param {number} count: number of dates to get (1,2,3 etc.)
* @param {string} dayName: name of day of week, min first 2 letters, any case ("Mon", "TU","we" etc)
* @param {Date} [d]: starting date
* @returns {string[]} Array of k date strings starting with next day, each +7 days from the previous date
*/
function getDates(count, dayName, d = new Date()) {
// Don't modify supplied date
d = new Date(+d);
// Get supplied day name as JS day index
let idx = ['su','mo','tu','we','th','fr','sa'].indexOf(dayName.toLowerCase().slice(0,2));
// Get index of d's day
let dayNum = d.getDay();
// Set to next instance of day, or today if current day == day
d.setDate(d.getDate() + idx - dayNum + (dayNum > idx? 7 : 0));
// Fill result array with required date strings
let result = [];
while (count-- > 0) result.push(d.toDateString()) && d.setDate(d.getDate() + 7);
return result;
}
// Examples
[[1, "Monday"],
[2, "TUES"],
[3, 'wed'],
[1, 'th'],
[3, 'fr'],
[2, 'sa'],
[1, 'su'],
[-20, 'fri'] // -ve count returns empty array
].forEach(args => console.log(getDates(...args)));

最新更新