我正在尝试编写一个脚本来将电子表格中的事件添加到日历中。我发现添加事件的时间总是1小时。我检查了时区设置,这是我找到的。
日历:(格林威治标准时间-04:00)东部时间 电子表格:(格林威治标准时间-05:00)东部时间 剧本:(格林威治标准时间-05:00)东部时间
所以它们都是东部时间,但日历在电子表格和脚本时使用夏令时。
我知道每次DST更改时我都可以手动调整GMT,以便产生合适的时间。但是有更好的方法,所以我可以设置并忘记吗?
答案 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);
}
注意:还有其他方法可以检索小时值,例如,请参阅this post。