Проблемы с часовым поясом API Календаря Google v3

Использование оболочки.Net API для Google Calendar API.

  1. Сначала получите основной идентификатор календаря
  2. Получить часовой пояс основного календаря (возвращает хорошие данные, например, "America/Los_Angeles")
  3. Создать календарь событий. Установите время начала и время окончания. Установите часовой пояс.
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недвижимость также будет обновлена. Я надеюсь, что это будет полезно кому-нибудь в будущем.

Другие вопросы по тегам