关于你的代码有很多话要说:
var thisDate = "Mon Dec 20 00:00:00 GMT-06:00 2021";
ECMA-262 不支持该时间戳格式,所以不要使用内置解析器来解析它,参见Why does Date.parse give incorrect results?
var nextYear = Number(currentYear)+1;
currentYear 来自哪里?
var lastDateofYear = new Date("12-31-"+nextYear);
解析不支持的格式,见上文。在 Safari 中,它返回一个无效的日期。
for(var i=thisDate; i <= lastDateofYear; ){
将 i 设置为分配给 thisDate 的字符串值。由于 lastDateOfYear 在 Safari 和 Firefox 中是无效日期,因此测试 i <= NaN 永远不会为真,并且永远不会进入循环。
var currentiDate = new Date(i);
解析i,见上文。
var month = currentiDate.getMonth()+1;
i.setMonth((month) % 12);
i 是一个字符串,它没有 setMonth 方法,所以我预计会出现类型错误,例如“i.setMonth is not a function " 如果循环实际运行。
i.setDate(currentiDate.getDate());
上面的另一个类型错误(但不会到这一步)。
Logger.log(currentiDate);
}
您似乎希望将一个日期按顺序添加 1 个月,直到它到达下一年的同一日期。简单地说,您可以添加 1 个月,直到您到达明年的同一日期,例如:
let today = new Date();
let nextYear = new Date(today.getFullYear() + 1, today.getMonth(), today.getDate());
let result = [];
do {
result.push(today.toString());
today.setMonth(today.getMonth() + 1);
} while (today <= nextYear)
但是,添加月份并不是那么简单。如果您将 1 个月添加到 1 月 1 日,您将获得 3 月 2 日或 3 日,具体取决于它是否是闰年。将 1 个月添加到 8 月 31 日将返回 10 月 1 日。
许多“添加月份”函数会检查日期是否超过一个月,如果是,则通过将日期设置为 0 将日期设置回上个月的月底,因此 1 月 31 日 + 1 个月2 月 28 日或 29 日。
但是,如果您使用该算法循环超过一年,您会得到 1 月 31 日、2 月 28 日、3 月 28 日、4 月 28 日等,而不是 1 月 31 日、2 月 28 日、3 月 31 日、4 月 30 日等。
见JavaScript function to add X months to a date和How to add months to a date in JavaScript?
一个更健壮的方法是有一个函数将 n 个月添加到日期并增加要添加的月份而不是日期本身,这样就可以分别处理每个月的月底问题加法,例如
/* Add n months to a date. If date rolls over an extra month,
* set to last day of previous month, e.g.
* 31 Jan + 1 month => 2 Mar, roll back => 28 Feb
*
* @param {number} n - months to add
* @param {Date} date - date to add months to, default today
* @returns {Date} new Date object, doesn't modify passed Date
*/
function addMonths(n, date = new Date()) {
let d = new Date(+date);
let day = d.getDate();
d.setMonth(d.getMonth() + n);
if (d.getDate() != day) d.setDate(0);
return d;
}
/* return array of n dates at 1 month intervals. List is
* inclusive so n + 1 Dates returned.
*
* @param {Date} start - start date
* @param {number} n - number of months to return
* @returns {Array} array of Dates
*/
function getMonthArray(n, start = new Date()) {
let result = [];
for (let i=0; i<n; i++) {
result.push(addMonths(i, start));
}
return result;
}
// Examples
// Start on 1 Dec
getMonthArray(12, new Date(2021,11,1)).forEach(
d => console.log(d.toDateString())
);
// Start on 31 Dec
getMonthArray(12, new Date(2021,11,31)).forEach(
d => console.log(d.toDateString())
);
这些函数不会尝试将时间戳解析为日期,该责任留给调用者。