在不同时区对NSDates进行比较?

时间:2010-01-13 09:04:51

标签: iphone objective-c cocoa nsdate nsdateformatter

我有一个NSDates数组,我使用[NSDate dateFromString]从字符串构建 在解析得到字符串的xml中,还有一个时区字符串。据我所知,NSDate手册中没有自己处理时区。我是否需要始终将此时​​区值存储在某处,并在每次需要时将其与所有属NSDate配对?

我还需要弄清楚,如果一个活动在伦敦10点开始,但我在丹麦,我的iPhone设置为丹麦时间,我的“伦敦活动”应该在09:00显示。

如果一个事件在伦敦10点钟开始,并在丹麦中午12点结束,如果我要使用带有丹麦语设置的iPhone比较开始时间和结束时间,我会得到活动时间为02:00,英国时间10:00,丹麦中午12点仅相隔1小时。

NSdate在一个时区范围内对这些事情非常有效,但引入时区部分只会让一切变得复杂。有没有办法抽象/隐藏所有这些计算,因为我发现可能会犯很多错误。

我已经浏览过Apple的NSDateformatter和NSDate指南,但它们非常含糊,并且有大量弃用的代码:/

感谢您给予的任何帮助。

4 个答案:

答案 0 :(得分:1)

您应该为UTC / GMT格式采用一个标准时区进行所有计算。

答案 1 :(得分:1)

根据NSDate referencedateWithString:将GMT的偏移量作为最后一个分量;虽然它不是一个时区,但它足以进行计算或比较。)

查看NSTimeZone reference,您可以使用abbreviationForDate:timeZoneWithAbbreviation:NSTimeZone实例中获取NSDate个对象。一旦你获得了时区,你就拥有了所需的一切。

答案 2 :(得分:1)

我将目前的日期和我想知道的日期转换为GMT,然后返回差异。所以我改变了一切来处理差异而不是实际的时间和日期。有点像转换为不同键的乐谱:)

+ (NSInteger) minutesUntilDate:(NSDate*) date withTimezoneOffset:(NSInteger) GMTOffset     
{

 NSDate *now = [NSDate date];
 NSTimeInterval localTimeZoneOffset = [[NSTimeZone defaultTimeZone] secondsFromGMT];

 now = [now addTimeInterval:(localTimeZoneOffset * -1)];

 date = [date addTimeInterval:(GMTOffset * 60 * 60) * −1];

 return ((NSInteger)[now timeIntervalSinceDate:date] / 60 ) * -1;
}

答案 3 :(得分:0)

一旦分配了NSDate,它们就不再具有时区信息。 NSDate是“无时区”,并且始终处于GMT状态。在分配时,您应确保NSDate正确理解您的格式。

获得NSDate后,您可以进行正常计算并忽略时区。

在将字符串读入NSDates并将其打印出来时,您只需要处理时区。