5

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

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

同样,如果一个活动于 10:00 点在伦敦开始并于 12:00 点在丹麦结束,如果我要使用具有丹麦设置的 iPhone 比较开始时间和结束时间,我会得到持续时间事件是 02:00 事件,虽然英国的 10:00 点和丹麦的 12:00 点仅相隔 1 小时。

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

我已经通过 Apple 的 NSDateformatter 和 NSDate 指南,但它们真的很模糊,并且包含大量已弃用的代码:/

感谢您提供的任何帮助。

4

4 回答 4

1

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

于 2010-01-13T09:21:54.967 回答
1

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

查看NSTimeZone 参考,您可以使用abbreviationForDate:和从实例timeZoneWithAbbreviation:中获取NSTimeZone对象。NSDate获得时区后,您就拥有了所需的一切。

于 2010-01-13T09:49:48.377 回答
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;
}
于 2010-01-14T17:49:11.250 回答
0

一旦您分配了 NSDate,它们就不再具有时区信息。NSDate 是“无时区”的,并且总是在格林威治标准时间。您应该确保 NSDate 在分配时正确理解您的格式。

一旦你有了 NSDate,你就可以进行正常的计算并忽略时区。

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

于 2010-01-14T16:28:09.967 回答