我在GAS从电子表格中选择正确的日期时遇到了问题。
作为测试,我将日期设置为2017年6月27日,并从中减去一天,但调试显示两个日期为2017年6月26日。怎么会这样?
答案 0 :(得分:1)
GAS使用标准的JavaScript Date对象。对象是引用类型,而不是值类型,如Number或Boolean(实际上,JS中的所有内容都是对象,对象是关联数组,但为了清楚起见,我们将它放在一边)。
假设您初始化日期并将其分配给另一个变量,如
var d1 = new Date(2017, 6, 26);
var temp = d1;
在此示例中,变量d1包含对日期对象存储在内存中的位置的引用。当您将d1指定给另一个变量时,它会 NOT 复制该对象(正如您所期望的那样,从两个整数值)。相反,它创建了另一个引用,但两个变量都指向内存中的同一个对象!
现在,您更容易理解为什么在Date对象上调用setDate()会修改原始日期变量。根据JS文档,setDate()方法"设置Date对象相对于当前设置月份的开头的日期"。在Date对象上调用方法将影响位于点左侧的对象。
以下代码是基于创建临时对象的变通方法。由于月份为零索引,因此6月为7月。
var d1 = new Date(2017, 6, 26); //Logs Wed Jul 26 00:00:00 GMT+03:00 2017
var temp = new Date(d1.getTime());
var d2 = new Date(temp.setDate(temp.getDate() - 1)); //Logs Tue Jul 25 00:00:00 GMT+03:00 2017