谷歌日历,电子表格和脚本处理时区的方式不同

时间:2015-06-30 22:44:32

标签: google-apps-script calendar

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

日历:(格林威治标准时间-04:00)东部时间 电子表格:(格林威治标准时间-05:00)东部时间 剧本:(格林威治标准时间-05:00)东部时间

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

我知道每次DST更改时我都可以手动调整GMT,以便产生合适的时间。但是有更好的方法,所以我可以设置并忘记吗?

1 个答案:

答案 0 :(得分:1)

不使用GMT-04:00对时区进行硬编码,而是使用本标准中定义的地理区域(也称为Canonical 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);
}

enter image description here

enter image description here

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