Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Datetime 日期数学-如何避免DST_Datetime_Google Apps Script_Google Sheets_Dst - Fatal编程技术网

Datetime 日期数学-如何避免DST

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),但什么也没发生 这个问题有没有一个

我在做一些约会手术。我检查了教程,所以要将日期增加一天,我要确保日期转换为“ms”,我只需添加“86400000”。 当我传递DST更改日期时出现问题

我希望避免使用任何条件来检查日期,因为我在一些循环中使用了它们,可以将它们与其他日期进行比较。拥有额外的IF可能会严重影响效率,尤其是在几千个条目中,它可能只改变2-3次

我试图改变

"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)
?请注意,如果您从工作表中读取时间戳,它可能也有自己的小时、分钟、秒和毫秒数据,因此除非您将这些数据归零,否则要获得毫秒级的匹配可能会很困难。