Datetime 日期数学-如何避免DST
我在做一些约会手术。我检查了教程,所以要将日期增加一天,我要确保日期转换为“ms”,我只需添加“86400000”。 当我传递DST更改日期时出现问题 我希望避免使用任何条件来检查日期,因为我在一些循环中使用了它们,可以将它们与其他日期进行比较。拥有额外的IF可能会严重影响效率,尤其是在几千个条目中,它可能只改变2-3次 我试图改变Datetime 日期数学-如何避免DST,datetime,google-apps-script,google-sheets,dst,Datetime,Google Apps Script,Google Sheets,Dst,我在做一些约会手术。我检查了教程,所以要将日期增加一天,我要确保日期转换为“ms”,我只需添加“86400000”。 当我传递DST更改日期时出现问题 我希望避免使用任何条件来检查日期,因为我在一些循环中使用了它们,可以将它们与其他日期进行比较。拥有额外的IF可能会严重影响效率,尤其是在几千个条目中,它可能只改变2-3次 我试图改变 "timeZone": "Europe/London" 在appscript.json中改为“Japan”(他们不使用DST),但什么也没发生 这个问题有没有一个
"timeZone": "Europe/London"
在appscript.json中改为“Japan”(他们不使用DST),但什么也没发生
这个问题有没有一个简单的解决方案,或者我是否需要编写一些变通代码或附加条件?提前谢谢
编辑:这是我检查和比较日期的代码部分
var dayMS = 24*60*60*1000;
var check_date = variables_sheet.getRange(2,1).getValue().getTime(); //get starting date
for (var i=1; i<=length; i++) {
if (check_date == Dates_Table[i][0].getTime())
{
sum = sum + Flow_Table[i][0]; //make a sum of values from the same date
}
else {
target_sheet.appendRow([new Date(check_date), "B", "C", sum, Balance_Table[i-1][0]]); //write consolidated days with sum
check_date = check_date+dayMS; //increment days
i--; //go back
sum = 0; //reset sum
}
};
var dayMS=24*60*60*1000;
var check_date=variables_sheet.getRange(2,1.getValue().getTime()//开始日期
对于(var i=1;i,从您问题的标题“如何避免DST”-您不能。许多时区的本地时间都有DST。您不能避免它-相反,您必须使用解释它的API
因为您已将dayMS
指定为等于24小时,所以您正在对此进行操作。典型的1小时DST转换的天数可能为23或25小时。也可能有30分钟长的转换,这可能是由于DST(至少在一个时区内)造成的,或者仅仅因为时区的标准时间偏移发生了更改
因此,在计算天数时,不要假设它们是一个固定的时间单位。它们的变化方式相同,每个月的天数不同,闰年比普通年份多一天。想想,“日期数学!=时间数学”
在上面的代码中,无需调用getTime()
。只需将值保留为Date
对象,并使用tehhowch在问题注释中指出的机制。换句话说,在删除所有.getTime()
事件后,使用以下方法提前日期:
check_date.setDate(check_date.getDate() + 1 ));
这会变异check\u date
变量,因此没有赋值
这是很好的,但是这个方法存在一个问题,那就是如果结果值正好在一个“间隙”的中间(例如,通过前向DST转换创建的一个)。,它将被调整为其他一些合法值。根据谷歌的应用程序脚本实现,它可能会向前调整,也可能会向后调整(我不确定是哪一个)。对于单个事件,这可能没问题,但我怀疑您以后是否希望使用调整后的值。因此,在单独的变量(例如,
x
)中跟踪从基准日期算起的整数天可能更安全-然后,不要一天一天地推进check\u date
,而是重新创建check\u date
循环的每个过程,并添加x
天。从纪元开始以毫秒为单位执行所有操作(即getTime()
的结果)。这始终基于UTC,因此在您需要将对象序列化回用户之前,时区是无关紧要的。在我使用check_date=check_date+dayMS的循环中发生的一切都是以毫秒为单位的值,但当我的计数器传递时间更改时,它会在if期间出错(check_date==另一个_date_in_ms)因此,我检查了chec_date中保存的值,当我将24小时准时添加到时间上时,从现在开始它就错了,因为这些天有25小时和23小时。然后使用the_date.setDate(the_date.getDate()+1)
?请注意,如果您从工作表中读取时间戳,它可能也有自己的小时、分钟、秒和毫秒数据,因此除非您将这些数据归零,否则要获得毫秒级的匹配可能会很困难。