今天是12月5日。
我的目标是在Google Apps脚本中获取前三个月中每个月的第一天和最后一天。
根据this,setDate(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');
}
答案 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);