Iphone NSDate独立于时区吗?

Iphone NSDate独立于时区吗?,iphone,objective-c,ios,nsdate,nstimezone,Iphone,Objective C,Ios,Nsdate,Nstimezone,我有一个应用程序,可以显示某些渡轮旅行的时间表 如果我旅行到不同的时区,比如说晚4小时,上午10点的渡轮旅行现在显示为早上6点 我知道这与如何根据日期的时区来处理日期有关,但我不知道如何改变这种行为 目前,我是如何获取日期并将其显示在UILabel上的: NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateFormat:@"HH:mm"]; [self.departureTi

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

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

我知道这与如何根据日期的时区来处理日期有关,但我不知道如何改变这种行为

目前,我是如何获取日期并将其显示在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的setTimeZone方法,是吗

:


(b.t.w.,如果有一艘渡轮需要穿越四个时区,我会感到惊讶;对我来说,这听起来像是一个游轮行程)

不要将NSDate值与NSLog之类的格式化输出混淆。NSDate是GMT,苹果的文档:

NSDate的唯一原始方法,TimeIntervalsIncerenceDate, 为NSDate接口中的所有其他方法提供基础。 此方法返回相对于绝对引用的时间值 日期:格林尼治标准时间2001年1月1日第一刻

输出:

referenceInterval: 0.000000  
estInterval:   18000.000000

您需要存储渡轮行驶发生的时区,并为该时区设置格式

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

您还可以使用apple参考中描述的NSDateComponents类:

如果需要创建独立于时区的日期,则可以将该日期存储为NSDateComponents对象,只要存储对相应日历的引用即可

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


了解NSDate本身独立于时区——它代表UTC(格林威治)时间。您必须设置NSDateFormatter的时区,以生成所需时区的结果。@DanielRHicks日期没有时区。它不代表UTC,因为UTC是时区,日期没有时区。按照惯例,NSDate中的时间偏移是相对于UTC的时间偏移。如果NSDate对象不是相对于UTC设置的,那么设置NSDate格式化程序的时区将是无用的。@DanielRHicks不完全是;参考日期是在UTC时区测量的,但它仍然是一个绝对时间点。绝对时间点独立于任何时区而存在。换句话说,参考日期可以用任何时区表示。你在玩弄文字。参考日期为“格林尼治标准时间2001年1月1日第一刻”。你可以用不同的时区表示,但这不是“第一个瞬间”。我们可能还需要处理夏令时。文档引用并不意味着“NSDate是GMT”,因为2001年1月1日的GMT可以用任何时区表示。我只是想理解你所说的“NSDate是GMT”是什么意思,因为我看不出一个NSDate值是否有一个时区的内部概念优先于任何其他时区(包括GMT)。除了文档以GMT任意引用参考日期的事实之外,如果没有明确提供时区,NSDate在接受字符串时可能会默认为GMT。当然我们可以-例如,相对于2001年1月1日布达佩斯时间02:00,它是0.0。您说它在任何其他时区都不是0.0,我向你展示了相对于布达佩斯时区的0.0。我不清楚你的最新评论是如何说明这一点的(或者它是如何显示“NSDate是GMT的”),我是说这一事实并不意味着在某种意义上NSDate存储GMT值。相对于堪察加半岛的中午,它也是0.0。为什么NSDate不是堪察加半岛时间?还是午夜比中午更特别?
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
        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);