setDate()不能正常工作?

时间:2017-12-05 06:09:46

标签: google-apps-script

今天是12月5日。

我的目标是在Google Apps脚本中获取前三个月中每个月的第一天和最后一天。

根据thissetDate(0)应该返回上个月的最后一天。

这不属于我的情况。它返回当月的第一天:

var d = new Date();      
var dd  = d.setDate(0);
Logger.log(getFormattedDate(dd));

记录

20171201

有趣的是,使用setDate(-1) 返回上个月的最后一天(与文档说的不同):

 var d = new Date();      
 var dd  = d.setDate(-1);
 Logger.log(getFormattedDate(dd));

日志

20171130

认为我理解setDate(0)setDate(-1)背后的逻辑我编写了我的新代码,假设文档是错误的。但后来我得到了这个:

 var d = new Date();

 var m_1_last  = d.setDate(-1);
 var m_1_first = d.setDate(0);
 var m_2_last  = d.setDate(-1);

 Logger.log(getFormattedDate(m_1_last));
 Logger.log(getFormattedDate(m_1_first));
 Logger.log(getFormattedDate(m_2_last));

我希望得到这个

20171130
20171101
20171031 <--

但我得到了这个

20171130
20171101
20170930 <--

因此,如果当前日期是该月的第一天d.setDate(-1)将不会返回上个月的最后一天,而是返回该月的前一个月。如果当前日期是在该月的第一天之后,d.setDate(-1)将仅返回上个月的最后一天。

我是否误解了某些内容,或者这是一个错误?

PS:

getFormattedDate()是一个辅助函数,其工作原理如下:

function getFormattedDate(dateInMilliseconds){
  var timeZone = AdWordsApp.currentAccount().getTimeZone();
  var d = new Date(dateInMilliseconds);
  return Utilities.formatDate(d, timeZone,'yyyyMMdd');
}

1 个答案:

答案 0 :(得分:0)

这个答案怎么样?

  • d.setDate(0)表示上个月的最后一天。
  • d.setDate(1)表示当月的第一天。

因此,当使用您的脚本时,修改后的参数如下所示。

修改后的脚本:

// var d = new Date();
var d = new Date(Date.now() + (new Date().getTimezoneOffset() / 60) * 60 * 60 * 1000); // Modified

var m_1_last  = d.setDate(0);
var m_1_first = d.setDate(1);
var m_2_last  = d.setDate(0);

Logger.log(getFormattedDate(m_1_last));
Logger.log(getFormattedDate(m_1_first));
Logger.log(getFormattedDate(m_2_last));

结果:

20171130
20171101
20171031

注意:

  • 为了对此进行测试,我使用var timeZone = Session.getScriptTimeZone();代替var timeZone = AdWordsApp.currentAccount().getTimeZone();

如果我误解了你的问题,我很抱歉。

编辑:

如果检索到new Date(),修改时区的偏移量怎么样?您可以尝试修改如下吗?

来自:

var d = new Date();

致:

var d = new Date(Date.now() + (new Date().getTimezoneOffset() / 60) * 60 * 60 * 1000);

参考: