NSDate独立于时区?

我有一个应用程序,显示某些渡轮旅行的时间表。

如果我旅行到不同的时区 – 比如说4个小时,上午10点的渡轮旅程现在显示为上午6点?

我知道这与date如何根据他们的时区来处理有关,但我无法弄清楚如何改变这种行为。

目前,我是如何获取date并将其显示在UILabel上的:

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateFormat:@"HH:mm"]; [self.departureTime setText:[dateFormatter stringFromDate:[self.route objectForKey:@"departureTime"]]]; [self.arrivalTime setText:[dateFormatter stringFromDate:[self.route objectForKey:@"arrivalTime"]]]; [dateFormatter release]; 

在此先感谢您的帮助。

您需要存储渡轮正在进行的时区,并将其格式化为该时区。

 NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateFormat:@"HH:mm"]; NSDate *now = [NSDate date]; NSLog(@"now:%@", [dateFormatter stringFromDate:now]); NSTimeZone *timeZone = [NSTimeZone timeZoneForSecondsFromGMT:(-8 * 3600)]; [dateFormatter setTimeZone:timeZone]; NSLog(@"adjusted for timezone: %@", [dateFormatter stringFromDate:now]); 

输出:

 2011-10-10 20:42:23.781 Craplet[2926:707] now:20:42 2011-10-10 20:42:23.782 Craplet[2926:707] adjusted for timezone: 16:42 

你已经看到NSDateFormatter的setTimeZone方法,是吗?

http://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSDateFormatter_Class/Reference/Reference.html#//apple_ref/occ/instm/NSDateFormatter/setTimeZone

(顺便说一下,如果有一个涉及四个时区的渡轮,听起来就像是游轮的行程)

你也可以使用苹果引用所描述的NSDateComponents类:

如果您需要创build一个独立于时区的date,则可以将date存储为NSDateComponents对象,只要您存储对相应日历的引用即可。

在iOS中,NSDateComponents对象可以包含日历,时区和date对象。 因此,您可以将日历与组件一起存储。 如果使用NSDateComponents类的date方法访问date,请确保关联的时区是最新的。

https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/DatesAndTimes/Articles/dtTimeZones.html#//apple_ref/doc/uid/20000185-SW1

不要将NSDate值与格式化输出(如NSLog)混淆。 NSDate是格林尼治标准时间,苹果的文档:

NSDate的唯一基本方法timeIntervalSinceReferenceDate为NSDate接口中的所有其他方法提供了基础。 此方法返回一个相对于绝对参考date的时间值 – 即2001年1月1日GMT的第一个瞬间。

 NSTimeInterval referenceInterval = [[dateFormatter dateFromString:@"1 January 2001 GMT"] timeIntervalSinceReferenceDate]; NSLog(@"referenceInterval: %f", referenceInterval); NSTimeInterval estInterval = [[dateFormatter dateFromString:@"1 January 2001 EST"] timeIntervalSinceReferenceDate]; NSLog(@"estInterval: %f", estInterval); 

输出:

 referenceInterval: 0.000000 estInterval: 18000.000000 
  NSDate *currentDateTime = datePicker.date; NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateFormat:@"EEE,MM-dd-yyyy HH:mm:ss"]; NSString *dateInStringFormated = [dateFormatter stringFromDate:currentDateTime]; NSLog(@"%@", dateInStringFormated);