Проблема с часовым поясом EKEventEditViewController

У меня возникла странная проблема с EKEventEditViewController при использовании его с пользовательскими часовыми поясами. Он ведет себя по-разному в двух случаях:

Ситуация 1 — работает нормально:

  • Запустить приложение
  • Создайте EKEventEditViewController, чтобы добавить новое событие с startDate = [дата NSDate]
  • Начало нового события отображается корректно (текущее время)
  • Измените часовой пояс по умолчанию с помощью [NSTimeZone setDefaultTimeZone:otherTimeZone]
  • Создайте EKEventEditViewController, чтобы добавить новое событие с startDate = [дата NSDate]
  • Начало нового события отображается корректно (текущее время адаптировано к часовому поясу)

Ситуация 2 — неожиданное поведение:

  • Запустить приложение
  • Измените часовой пояс по умолчанию с помощью [NSTimeZone setDefaultTimeZone:otherTimeZone]
  • Создайте EKEventEditViewController, чтобы добавить новое событие с startDate = [дата NSDate]
  • Начало нового события отображается неправильно (смещение часового пояса системы + смещение часового пояса по умолчанию)
  • Изменить часовой пояс по умолчанию обратно на системный часовой пояс [NSTimeZone setDefaultTimeZone: [NSTimeZone systemTimeZone]]
  • Создайте EKEventEditViewController, чтобы добавить новое событие с startDate = [дата NSDate]
  • Начало нового события по-прежнему отображается неправильно (смещение часового пояса системы + смещение часового пояса по умолчанию)

Я предполагаю, что при первом отображении EKEventEditViewController он каким-то образом кэширует часовой пояс по умолчанию, а затем использует его в качестве смещения.

Кто-нибудь сталкивался с подобной проблемой? Это ошибка или я что-то упускаю?


person Laurynas    schedule 29.08.2011    source источник
comment
Кроме того, только что заметил, что EventKit в целом ведет себя странно после установки пользовательского часового пояса с помощью [NSTimeZone setDefaultTimeZone:otherTimeZone]. Например, время в поле Starts отличается от времени, отображаемого в UIDatePicker.   -  person Laurynas    schedule 05.09.2011


Ответы (1)


У меня была точно такая же проблема. Я хранил все даты в базе данных в часовом поясе GMT ​​со смещениями (отдельно). Мое приложение использует пользовательский часовой пояс с самого начала его запуска (GMT). Когда я хотел использовать эти даты при экспорте событий в календарь, я видел неправильные даты начала и окончания. Что помогло мне решить проблему, так это сначала преобразовать даты, которые я сохранил в базе данных, в часовой пояс системы, используя следующий метод конвертера (см. Ниже). Такая преобразованная дата, переданная в EKEventEditViewController, затем правильно отображала даты. Надеюсь, это решит и вашу проблему.

+ (NSDate *) convertToSystemTimeZone:(NSDate*)sourceDate {
NSTimeZone* sourceTimeZone = [NSTimeZone timeZoneWithAbbreviation:@"GMT"];
NSTimeZone* destinationTimeZone = [NSTimeZone systemTimeZone];  
NSInteger sourceGMTOffset = [sourceTimeZone secondsFromGMTForDate:sourceDate];
NSInteger destinationGMTOffset = [destinationTimeZone secondsFromGMTForDate:sourceDate];
NSTimeInterval interval = destinationGMTOffset - sourceGMTOffset;   
NSDate* destinationDate = [[[NSDate alloc] initWithTimeInterval:interval sinceDate:sourceDate] autorelease];         
return destinationDate; }
person krasnyk    schedule 05.01.2012