1

将 EKEventEditViewController 与自定义时区一起使用时,我遇到了一个奇怪的问题。它在两种情况下表现不同:

情况 1 -工作正常

  • 启动应用程序
  • 创建 EKEventEditViewController 以使用 startDate = [NSDate date] 添加新事件
  • 新事件开始正确显示(当前时间)
  • 使用 [NSTimeZone setDefaultTimeZone:otherTimeZone] 更改默认时区
  • 创建 EKEventEditViewController 以使用 startDate = [NSDate date] 添加新事件
  • 新事件开始正确显示(当前时间调整为时区)

情况 2 -意外行为

  • 启动应用程序
  • 使用 [NSTimeZone setDefaultTimeZone:otherTimeZone] 更改默认时区
  • 创建 EKEventEditViewController 以使用 startDate = [NSDate date] 添加新事件
  • 新事件开始显示不正确(系统时区偏移+默认时区偏移)
  • 将默认时区更改回系统时区 [NSTimeZone setDefaultTimeZone:[NSTimeZone systemTimeZone]]
  • 创建 EKEventEditViewController 以使用 startDate = [NSDate date] 添加新事件
  • 新的事件开始仍然显示不正确(系统时区偏移+默认时区偏移)

我猜想在第一次显示 EKEventEditViewController 时,它会以某种方式缓存默认时区,然后将其用作偏移量。

有没有人遇到过类似的问题?这是一个错误还是我错过了什么?

4

1 回答 1

0

我有完全相同的问题。我将数据库中的所有日期存储在 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; }
于 2012-01-05T10:51:35.380 回答