我有以下使用 Google Apps 腳本的代碼,但是當我將其注銷時,我得到以下結果。我希望 GAS 在下個月記錄并在到達“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);
}
結果:
2021 年 12 月 20 日星期一 00:00:00 GMT-06:00 2021 年
1 月 20 日星期三 00:00:00 GMT-06:00 2021 年
2 月 20 日星期六 00:00:00 GMT-06:00 2021 年
3 月 20 日星期六 00:00:00 GMT-05:00 2021 年
4 月 20 日星期二 00:00:00 GMT-05:00 2021 年
5 月 20 日星期四 00:00:00 GMT-05:00 2021 年
6 月 20 日星期日 00:00:00 GMT-05:00 2021 年
7 月星期二20 00:00:00 GMT-05:00 2021 年
8 月 20 日星期五 00:00:00 GMT-05:00 2021 年
9 月 20 日星期一 00:00:00 GMT-05:00 2021 年
10 月 20 日星期三 00:00:00 GMT- 05:00 2021 年
11 月 20 日星期六 00:00:00 GMT-06:00 2021 年
12 月 20 日星期一 00:00:00 GMT-06:00 2021 年
1 月 20 日星期三 00:00:00 GMT-06:00 2020 年
2 月 20 日星期六:00:00 GMT-06:00 2021 年
3 月 20 日星期六 00:00:00 GMT-05:00 2021 年
4 月 20 日星期二 00:00:00 GMT-05:00 2021 年
uj5u.com熱心網友回復:
關于您的代碼有很多話要說:
var thisDate = "Mon Dec 20 00:00:00 GMT-06:00 2021";
ECMA-262 不支持這種時間戳格式,所以不要使用內置的決議器來決議它,請參閱為什么 Date.parse 給出不正確的結果?
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 不是函式”之類的型別錯誤。
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 個月,你會得到 2 或 3 月,這取決于它是否是閏年。將 1 個月添加到 8 月 31 日將回傳 10 月 1 日。
許多“添加月份”函式會檢查日期是否超過了額外的一個月,如果確實如此,則通過將日期設定為 0 將日期設定回上個月的結束日期,因此 1 月 31 日 1 個月給出 28 或 29二月
但是,如果您使用該演算法回圈超過一年,您會得到 1 月 31 日、2 月 28 日、3 月 28 日、4 月 28 日等,而不是 1 月 31 日、2 月 28 日、3 月 31 日、4 月 30 日等。
請參閱JavaScript 函式向日期添加 X 個月和如何在 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())
);
這些函式不會嘗試將時間戳決議為日期,該責任留給呼叫者。
uj5u.com熱心網友回復:
據我了解,您希望在日志中列印從給定日期到下一年的最后一個月的每個月。
您可以在以下代碼中執行此操作:
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);
}
如果我有任何錯誤,請隨時在評論中向我指出。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/394362.html
標籤:javascript 日期 for循环 谷歌应用程序脚本
