Проблемы летнего времени со скриптом Google Apps и календарем Google - PullRequest
0 голосов
/ 11 февраля 2019

Я создаю школьный проект для управления классами, у меня проблема с часовыми поясами, и 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)
    );
}

Это работает хорошо, пока не достигнет 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, но я могу вручную отредактировать или удалить его.Проблема здесь в том, что мне нужно сделать это вручную.

Я также нашел .setTimeZone (string) в документации Google: здесь и здесь

Проблема сейчас в том, что я не могу заставить его работать, независимо от того, что я пробовал, и до UTC

1 Ответ

0 голосов
/ 12 февраля 2019

Хорошо, после некоторого углубления в это похоже, что есть что-то вроде решения.

Календарь Google будет смотреть на часовой пояс скрипта, если он не указан в объекте Date, который вы передаете в него.В вашем случае это не так (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 основана на этом ответе .

Используя это, я получил (начало было 7 утра):

calendar screenshot

...