问题
首先,我要澄清的是,这个问题不是javascript中两个日期之间的月差或javascript月差的重复
我的问题是关于在两个日期之间获得月份,而不是的月份数。
预期结果
因此,如果date1
是2022年1月11日(mm/dd/yyyy),而date2
是2023年2月20日,则它应该像["November", "December", "January", "February"]
一样输出一个月份数组,包括date1
和date2
的月份。我需要知道如何返回两个日期之间的实际月份,而不是月份数。有人能解释一下该怎么做吗?
问题中链接的帖子已经是一个良好的开端。
也许想想当你想把结果写在一张纸上时,你会怎么做。
当我们知道要开始的月份时,作为索引[0…11],我们可以从那里开始计数,并从数组中添加月份名称:
const xmas = new Date("December 25, 1999 23:15:30");
const summer = new Date("June 21, 2003 23:15:30");
function monthsBetween(dstart, dend) {
const monthNames = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
let result = [];
let current = dstart.getMonth();
let end = (dend.getFullYear() - dstart.getFullYear()) * 12 + dend.getMonth();
for (;current <= end; current += 1) {
result.push(monthNames[current % 12]);
}
return result;
}
console.log(monthsBetween(xmas, summer)); // [December, January, February..., December, January, ...., June (multiple years)
console.log(monthsBetween(xmas, xmas)); // ["December"]
在您的示例2022-11-01到2023-02-20中,current
将从10(11月,从0索引)计数到13(1:2月,从0+1年索引=12个月差异)
您可以循环从开始到结束的日期,边走边收集月份名称。
开始和结束应该是Date对象,以及如何将它们从时间戳(如";2022年1月11日";是一个单独的问题,应在之前的步骤中处理。
/* Get month names from start date to end date
* @param {Date} start - date to start from
* @param {Date} end - date to end at
* @param {string} lang - language for month names
* @returns {string[]} month names from start to end inclusive
*/
function getMonthNames(start = new Date(), end = new Date(), lang = 'en') {
let d = new Date(start.getFullYear(), start.getMonth());
let months = [];
while (d <= end) {
months.push(d.toLocaleString(lang,{month:'long'}));
d.setMonth(d.getMonth() + 1);
}
return months;
}
let start = new Date(2022, 10, 1); // 01 Nov 2022
let end = new Date(2023, 1, 20); // 20 Feb 2023
console.log(getMonthNames(start, end))