日期数学 - 如何避免夏令时

时间:2018-05-05 20:28:01

标签: datetime google-apps-script google-sheets dst

我正在做日期的一些操作。我已经检查过教程,所以要将日期增加一天我确保将日期转换为' ms'我只需添加' 86400000'。 通过DST更改日期时出现问题。

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

我试图改变

"timeZone": "Europe/London"

在appscript.json中,#34;日本" (他们不使用夏令时)但没有任何事情发生。

是否有解决此问题的简单方法,还是我必须制作一些解决方法代码或额外条件?提前谢谢!

编辑:这是我检查和比较日期的代码的一部分。

     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

    }

  };

1 个答案:

答案 0 :(得分:1)

从问题的标题,&#34;如何避免DST&#34; - 你不能。许多时区的当地时间都有夏令时。您无法避免 - 而是必须使用能够解释它的API。

因为您已将dayMS指定为相等的24小时,所以您正在努力解决此问题。典型的1小时DST过渡天数可以是23或25小时。它也可能具有30分钟长的转换,这可能是由于DST(在至少一个时区中),或者仅仅因为时区的标准时间偏移发生了变化。

因此,在计算天数时,不要假设它们是固定的时间单位。它们的变化方式与每个月的天数不同,闰年的日期比常年多一天。想想,&#34;日期数学!=时间数学&#34;。

在上面的代码中,无需再拨打getTime()。只需将值保留为Date个对象,并使用tehhowch在问题注释中指出的机制。换句话说,删除所有.getTime()次出现后,请使用以下日期推进日期:

check_date.setDate(check_date.getDate() + 1 ));

变异 check_date变量,因此没有赋值。

这很好,但是这种方法存在一个问题 - 即如果结果值正好位于&#34;间隙的中间。 (例如由春季前进DST过渡创建的那个),它将被调整为其他一些合法值。根据Google的应用程序脚本实现,它可能向前调整或者可能向后调整(我不确定哪个副手)。这可能适用于单次事件,但我怀疑您是否希望继续使用该调整后的值。因此,在单独的变量(例如,x)中跟踪基准日期的整数天数可能更安全 - 然后,不是一次一天推进check_date,而是“#{1}}。 d每次循环重新创建check_date并添加x天。