首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Google脚本将月份添加到某个日期,直到达到特定日期

Google脚本将月份添加到某个日期,直到达到特定日期
EN

Stack Overflow用户
提问于 2021-12-26 19:39:01
回答 2查看 1.4K关注 0票数 0

我使用Google脚本编写了下面的代码,但是当我将它注销时,我会得到以下结果。我想要天然气记录下个月,并停止一旦它到达"lastDateofYear“。不管出于什么原因,今年我的成绩没有变化,它只是不断地重复今年。请帮帮忙。

代码语言:javascript
复制
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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-12-26 20:23:23

据我所知,您希望在日志中每个月从给定日期打印到下一年的最后一个月。

您可以在以下代码中这样做:

代码语言:javascript
复制
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);
}

如果我做错了什么,可以在评论中向我指出。

票数 0
EN

Stack Overflow用户

发布于 2021-12-27 01:57:29

关于您的代码,有很多话要说:

代码语言:javascript
复制
var thisDate = "Mon Dec 20 00:00:00 GMT-06:00 2021";

该时间戳格式不受ECMA-262支持,因此不要使用内置解析器解析它,请参阅。

代码语言:javascript
复制
var nextYear = Number(currentYear)+1;

currentYear从哪里来?

代码语言:javascript
复制
var lastDateofYear = new Date("12-31-"+nextYear);

解析不受支持的格式,请参阅上文。在Safari中,它返回无效的日期。

代码语言:javascript
复制
  for(var i=thisDate; i <= lastDateofYear; ){  

将i设置为分配给thisDate的字符串值。因为lastDateOfYear在Safari和Firefox中是一个无效的日期,所以测试i <= NaN从来都不是真的,并且从来不输入循环。

代码语言:javascript
复制
    var currentiDate = new Date(i);

我的分析,见上文。

代码语言:javascript
复制
    var month = currentiDate.getMonth()+1;
    i.setMonth((month) % 12);

我是一个字符串,它没有setMonth方法,所以如果循环实际运行的话,我希望会出现一个类型错误,比如"i.setMonth不是一个函数“。

代码语言:javascript
复制
    i.setDate(currentiDate.getDate());

另一个Type,如上面所示(但不会达到这个程度)。

代码语言:javascript
复制
    Logger.log(currentiDate);
  }

似乎您希望将1个月按顺序添加到某个日期,直到该日期在下一年达到相同日期为止。微不足道的是,你可以在明年同一天之前再加一个月,比如:

代码语言:javascript
复制
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个月添加到一个日期中,并增加要添加的月份,而不是日期本身,这样就可以针对每个添加单独处理月尾问题。

代码语言:javascript
复制
/* 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())
);

函数不试图将时间戳解析为日期,这一责任由调用方负责。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70489332

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档