根据特定时区计算日期

时间:2010-11-14 16:52:02

标签: iphone objective-c ipad

使用NSDate对我来说很棘手。我知道它代表一个特定的时间点,不依赖于特定的时区或地区。我还阅读了很多关于NSDateFormatter,NSCalendar,NSDateComponents,NSlocale和NSTimeZone的文档。

我正在尝试根据两个特定的太平洋时区进行计算。例如,我希望能够计算从日期A到日期B的天数。我不想通过解析字符串来“破解”它,因为我想要计算像DST这样的东西。

有人可以推荐一种方法吗?

编辑:找到解决方案:

NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSTimeZone *zone = [NSTimeZone timeZoneWithName:@"PST"];
[calendar setTimeZone:zone];
NSDateComponents *comp = [calendar components:(NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit) fromDate:date];
date = [calendar dateFromComponents:comp];
[calendar release];

这导致日期本地化为太平洋时间。我知道这导致了不同语言环境的问题,但我的应用程序是独一无二的,这是合理的。

然后我可以使用除以86400的除法来比较日期。

虽然看起来有点矫枉过正 - 很多额外的工作 - 也许有一个更短的方式来获得特定时区的约会?

3 个答案:

答案 0 :(得分:4)

您还可以将两个NSDate对象转换为GMT。像这样:

NSDate *date;
NSTimeZone *timeZone;
NSDate *gmtDate = [date dateByAddingTimeInterval:-[timeZone secondsFromGMTForDate:date]];

然后将NSCalendar的时区设置为GMT。像这样:

NSCalendar *calendar;
[calendar setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0];

然后,您可以使用日历和GMT日期来计算您需要知道的任何内容。

答案 1 :(得分:3)

我想你可以计算出时区之间的差异。像这样:

NSDate *date1;
NSDate *date2;
NSTimeInterval dateDifference = [date1 timeIntervalSinceDate:date2];

然后计算时区差异。像这样:

NSTimeZone *timeZone1;
NSTimeZone *timeZone2;
// Assuming date1 is in timeZone1...
NSTimeInterval timeZoneDifference = [timeZone1 secondsFromGMTForDate:date1] - [timeZone2 secondsFromGMTForDate:date2];

然后将两者相加。像这样:

NSTimeInterval difference = dateDifference + timeZoneDifference;

答案 2 :(得分:2)

您应该创建两个NSDate个实例,代表您要比较的两个日期。为此,您可以设置NSDateComponents个实例,并不仅设置其日/月/年/小时,还设置其时区(-[NSDateComponents setTimeZone:])。然后致电-[NSDateComponents date]将其转换为NSDate

[date1 timeIntervalSinceDate:date2]然后给出两个日期之间的差异(以秒为单位)。将结果除以86,400以得到天数。

或者,您可以直接与[NSCalendar components:fromDate:toDate:options:]个实例联系NSDateComponent,以获得NSDateComponents两者之间的差异。