【问题标题】:google calendar, spreadsheet and script handle time zone differently谷歌日历、电子表格和脚本以不同方式处理时区
【发布时间】:2015-09-17 22:19:43
【问题描述】:

我正在尝试编写一个脚本来将事件从电子表格添加到日历。我发现添加事件的时间总是 1 小时。我检查了时区设置,这就是我发现的。

日历:(GMT-04:00) 东部时间 电子表格:(GMT-05:00) 东部时间 脚本:(GMT-05:00) 东部时间

所以它们都是东部时间,但日历使用夏令时,而电子表格和脚本。

我知道每次 DST 更改时我都可以手动调整 GMT,以使结果时间正确。但是有没有更好的方法,让我可以设置和忘记?

【问题讨论】:

    标签: google-apps-script calendar


    【解决方案1】:

    不要使用 GMT-04:00 对时区进行硬编码,而是使用本标准中定义的地理区域的文字表达(又名规范 ID):Joda.org

    这就是 Google Apps 脚本所使用的。

    你也可以更简单地使用

    SpreadsheetApp.getActive().getSpreadsheetTimeZone()

    或来自日历对象:calendar.getTimeZone()

    所有这些参数都会自动处理夏令时,而 GMT+xx:xx 方法则不是这样。

    只要两者在同一个时区,你就不应该有任何问题。日历有一个setTimeZone(timeZone) 方法,电子表格有一个setSpreadsheetTimeZone(timeZone) 方法,因此很容易同步两者


    编辑

    以下评论

    由于您似乎将日期和时间组合在一个唯一的日期对象中,并且夏令时会给您带来麻烦(因为电子表格中的“纯时间”值会自动转换为日期 JavaScript 对象并进行夏令时校正),下面是我用来解决这个问题的一个小代码。我添加了一些日志来显示中间值;

    function combineDateAndTime(){
      // in this example cell A1 has a date and cell B1 has time
      var sh = SpreadsheetApp.getActiveSpreadsheet().getSheets()[0];
      var dateOnly = sh.getRange('A1').getValue();
      var timeOnly = sh.getRange('B1').getValue();
      Logger.log('dateOnly object is : '+dateOnly+'\ntimeOnly object is : '+timeOnly);
      var hours = Number(Utilities.formatDate(timeOnly, 'GMT'+timeOnly.toString().split('GMT')[1],'hh'));
      var minutes = timeOnly.getMinutes();
      var completeDateAndTime = new Date(dateOnly.setHours(hours,minutes,0,0));
      Logger.log('completeDateAndTime is : '+completeDateAndTime);
    }
    

    注意:还有其他方法可以检索小时值,例如,请参阅this post

    【讨论】:

    • 那是因为 1899 年 12 月不是夏天!!!在 JavaScript 中,没有日期就没有时间值,它总是一个完整的日期和时间值。您必须在脚本中处理好这一点。
    • 日历和电子表格都在美国/纽约时区,但不同的 GMT:日历 GMT-0400,电子表格 GMT-0500。在电子表格中,我有一个格式为时间“9:30”(值 [1])的单元格。 var time1 = new Date(values[1]); Logger.log('time1: ' + time1); //我会得到: // time1: Sat Dec 30 1899 09:30:00 GMT-0500 (EST) 当我将使用这个时间的事件添加到日历时,它变成了 10:30,因为日历是 GMT- 0400(美国东部时间)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多