EKEventEditViewController时区问题

时间:2011-08-29 13:41:58

标签: iphone objective-c cocoa-touch eventkit

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

情况1 - 正常工作

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

情况2 - 意外行为

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

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

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

1 个答案:

答案 0 :(得分:0)

我遇到了同样的问题。我使用偏移量(单独)将所有日期存储在GMT timeZone中的数据库中。我的应用程序从运行开始(GMT)开始使用自定义timeZone。当我想在将事件导出到日历时使用这些日期时,我看到错误的开始和结束日期。帮我解决问题的原因是首先使用以下转换器方法将我在数据库中存储的日期转换为系统时区(见下文)。传递给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; }