2010-11-14 126 views
2

使用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除以发布的日期。

尽管看起来像是过度杀伤 - 很多额外的工作 - 也许有一个更短的方式来获得与特定时区的日期?

回答

2

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

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

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

+0

NSDateComponents的问题是它需要输入日/月/年/ etc来设置它。如果我通过一个NSDate来创建它,它使用GMT。如果我可以在特定的时区使用当前实际时间获取NSDate对象,那就可以。但是当我用[NSDate date]实例化它只能解析为GMT。 – 2010-11-14 18:56:01

+0

标记为最接近的正确。 – 2010-11-14 19:51:18

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; 
+0

我喜欢这个答案,它会工作......但我正在寻找一个我可以比较的对象的特定实例。例如,可以设置为适当时区的NSDate对象(或类似对象)。然后,一旦我已经有了该时区的日期,就可以用它来计算天数,例如NSCalendar和NSDateComponents。 – 2010-11-14 18:58:05

+0

为你提供帮助。谢谢。 – 2010-11-14 19:52:25

4

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

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

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

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

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

+0

为你提供帮助。谢谢。 – 2010-11-14 19:51:45