Проблемы с часовым поясом API Календаря Google v3
Использование оболочки.Net API для Google Calendar API.
- Сначала получите основной идентификатор календаря
- Получить часовой пояс основного календаря (возвращает хорошие данные, например, "America/Los_Angeles")
- Создать календарь событий. Установите время начала и время окончания. Установите часовой пояс.
Dim eStart As New EventDateTime eStart.DateTime = _startAt eStart.TimeZone = GoogleTimeZone Dim eEnd As New EventDateTime eEnd.DateTime = _endAt entry.Start = eStart entry.End = eEnd eEnd.TimeZone = GoogleTimeZone CalService.Events.Insert(entry, calendarid).Execute()
Но события создаются в 3 часа ночи, когда указано время начала 11 утра.
Документация Google API гласит: "Смещение часового пояса требуется, если часовой пояс явно не указан в часовом поясе", а для часового пояса "Часовой пояс, в котором указано время. (Отформатировано как имя базы данных часовых поясов IANA, например," Европа / Цюрих "). ")".
Значение часового пояса указывается правильно.
По сути, не имеет значения, указан часовой пояс или нет. Событие создается в GMT в календаре Google. Что здесь не так?
2 ответа
Исправлено (или, скажем так, взломано). Оболочки Google .Net API абсолютно дерьмовы (и это касается обертки всех их API, а не только Calendar API).
Проблема заключалась в том, что event.Start
а также event.End
автоматически конвертирует даты и добавляет "Z" в конце. Это говорит Google, что дата в формате GMT. Нет смысла ставить "Z", потому что даже без него Google считает GMT. В общем, event.TimeZone=value
игнорировалось, потому что время было добавлено "Z".
После того как я удалил "Z", все работало нормально.
entry.Start.DateTimeRaw = replace(entry.Start.DateTimeRaw,"Z","")
entry.End.DateTimeRaw = replace(entry.End.DateTimeRaw,"Z","")
Я исправил это, создав экземпляр объекта DateTime, который использует DateTimeKind
enum как один из конструкторов. Я нашел по умолчанию DateTime.Kind
значение свойства DateTimeKind.Utc
при десериализации даты JSON. Вот почему значение Z (UTC) в Raw для меня. Значение часового пояса будет правильным, когда DateTimeKind.Local будет применен к аргументу DateTimeKind в одном из конструкторов, который его принимает.
DateTime dt = new DateTime(oldDateTime.Ticks, DateTimeKind.Local);
DateTime dt = new DateTime(yearVar, monthVar, dayVar, hourVar, minuteVar, secondVar, DateTimeKind.Local);
Вместо того, чтобы устанавливать Datetime
собственность, которая является частью Start
а также End
объекты, вы должны дать DateTimeRaw
значение и назначьте ему часовой пояс следующим образом:
eventItem.Start = new EventDateTime()
{
DateTimeRaw = input.Start.ToString("yyyy-MM-ddTHH:mm:ss"),
TimeZone = "America/New_York"
};
Заметил, что я не добавляю Z или какое-либо представление часового пояса в конце строкового формата. Это должно решить проблему и помешать Google игнорировать свойство часового пояса при установке значения.
Кроме того, если вы наведете курсор на DateTime
собственность Start
или End
в Visual Studio он описывается следующим образом: DateTime representation of EventDateTime.DateTimeRaw
(см. изображение).
Что в этом случае, заменив Z
значение для пустой строки только усугубит проблему, потому что ваш DateTime
недвижимость также будет обновлена. Я надеюсь, что это будет полезно кому-нибудь в будущем.