我使用Google脚本编写了下面的代码,但是当我将它注销时,我会得到以下结果。我想要天然气记录下个月,并停止一旦它到达"lastDateofYear“。不管出于什么原因,今年我的成绩没有变化,它只是不断地重复今年。请帮帮忙。
var thisDate = "Mon Dec 20 00:00:00 GMT-06:00 2021";
var nextYear = Number(currentYear)+1;
var lastDateofYear = new Date("12-31-"+nextYear);
for(var i=thisDate; i <= lastDateofYear; ){
var currentiDate = new Date(i);
var month = currentiDate.getMonth()+1;
i.setMonth((month) % 12);
i.setDate(currentiDate.getDate());
Logger.log(currentiDate);
}结果:
星期一十二月二十日格林尼治时间:06:00 2021
日1月20日:00:00格林尼治时间-06:00 2021
2月20日星期六格林尼治时间06:00 2021
星期六3月20日:00:00格林尼治时间-05:00 2021
4月20日(星期二)格林尼治时间:05:00 2021
清华5月20日格林尼治时间:05:00 2021
孙俊20 :00格林尼治时间-05:00 2021
7月20日: 00:00:00 -05:00 2021
8月20日星期五格林尼治时间-05:002021
星期一9月20日格林尼治时间-05:002021
10月20日(星期三)格林尼治时间-05:00 2021
星期六11月20日格林尼治时间06:00 2021
星期一十二月二十日格林尼治时间:06:00 2021
日1月20日:00:00格林尼治时间-06:00 2021
2月20日星期六格林尼治时间06:00 2021
星期六3月20日:00:00格林尼治时间-05:00 2021
4月20日(星期二)格林尼治时间:05:00 2021
发布于 2021-12-26 20:23:23
据我所知,您希望在日志中每个月从给定日期打印到下一年的最后一个月。
您可以在以下代码中这样做:
let start = new Date("Mon Dec 20 00:00:00 GMT-06:00 2021");
let currentYear = new Date().getFullYear();
let nextYear = currentYear + 1;
let end = new Date(nextYear, 11, 31);
while (start <= end) {
// You can use Logger.log() here if you want. I use console.log() for demo purpose
console.log(new Date(start).toDateString());
start.setMonth(start.getMonth() + 1);
}
如果我做错了什么,可以在评论中向我指出。
发布于 2021-12-27 01:57:29
关于您的代码,有很多话要说:
var thisDate = "Mon Dec 20 00:00:00 GMT-06:00 2021";该时间戳格式不受ECMA-262支持,因此不要使用内置解析器解析它,请参阅。
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);我的分析,见上文。
var month = currentiDate.getMonth()+1;
i.setMonth((month) % 12);我是一个字符串,它没有setMonth方法,所以如果循环实际运行的话,我希望会出现一个类型错误,比如"i.setMonth不是一个函数“。
i.setDate(currentiDate.getDate());另一个Type,如上面所示(但不会达到这个程度)。
Logger.log(currentiDate);
}似乎您希望将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)然而,增加月份并不是那么简单。如果你把一个月加到一月一日,你将得到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日等等。
见和
一种更健壮的方法是有一个函数将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())
);
函数不试图将时间戳解析为日期,这一责任由调用方负责。
https://stackoverflow.com/questions/70489332
复制相似问题