Google Apps脚本和Google日历的DST问题

时间:2019-02-11 18:21:32

标签: javascript datetime google-apps-script google-calendar-api dst

我正在创建一个用于管理班级的学校项目,时区存在问题,DST是我的代码:

javascript
dejt = new Date(thisYear, 8, day, beginTime, endTime, 0, 0);
dejt.toLocaleString("en-US", {timezone: "Europe/Belgrade"});

然后我通过一些函数,直到:

javascript
function makeCalendar(name, begin, end, calendar) {
    var eventSeries = CalendarApp.getCalendarById(calendar).createEventSeries(
        name,
        begin,
        end,
        CalendarApp.newRecurrence()
            .addWeeklyRule().interval(2).until(endDate)
    );
}

效果很好,直到10月29日一切都移动了一个小时。

  

我如何管理DST?

编辑:

在将脚本设置为GMT(无夏令时)之后,事情变得更加一致,每个日期均为+00:00

Logs:
[19-02-12 11:30:15:809 CET] Sun Feb 17 00:00:00 GMT+00:00 2019
[19-02-12 11:30:15:810 CET] Mon Feb 18 00:00:00 GMT+00:00 2019
[19-02-12 11:30:24:051 CET] Mon Sep 03 14:00:00 GMT+00:00 2018
[19-02-12 11:30:24:503 CET] Mon Sep 03 14:50:00 GMT+00:00 2018

现在唯一的问题是,重复发生的事件只会改变应该节省夏令时的时间(不是新的错误,以前是这样的。)

编辑:

我发现的新东西: 如果您手动编辑事件,则有一个时区框。我的脚本使它成为UTC,但我可以手动编辑或删除它。这里的问题是我需要手动执行。

我还在Google文档中找到了.setTimeZone(string): herehere

现在的问题是,无论我尝试了什么事件,都无法使它正常工作,而且就像UTC一样

1 个答案:

答案 0 :(得分:0)

好了,在对此进行了深入研究之后,似乎有了解决之道。

除非您要传递给脚本的Date对象中指定了该脚本,否则Google日历会查看该脚本的时区。在您的情况下,它不是(toLocaleString不会修改原始对象,如果这样做,将字符串传递到createEventSeries时会出错。)无论如何,您脚本的时区似乎是贝尔格莱德,并且存在夏令时,时间更改等。

最后,可能的解决方案。我不知道日历服务是否允许不考虑DST,因此尝试解决此问题:

// function to convert date to UTC so that it retains original hours value
function convertDateToUTC(date, timezoneOffset) { 
    return new Date(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), date.getUTCHours() + timezoneOffset, date.getUTCMinutes(), date.getUTCSeconds()); 
}
// 1 is the timezone offset from GMT
makeCalendar('test event', convertDateToUTC(beginDate, 1), convertDateToUTC(endDate, 1), calendar.getId());

功能convertDateToUTC基于this answer

使用此方法,我得到了(最初时间是早上7点):

calendar screenshot