NSDate独立于时区?

时间:2011-10-11 00:09:05

标签: iphone objective-c ios nsdate nstimezone

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

如果我前往不同的时区 - 比如说落后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];

提前感谢您的帮助。

5 个答案:

答案 0 :(得分:7)

您需要存储渡轮乘坐时区,并为该时区进行格式化。

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

答案 1 :(得分:2)

您已经看过NSDateFormatter的setTimeZone方法,是吗?

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

(顺便说一句,如果有渡轮涉及越过四个时区,我会感到很惊讶;听起来像是一艘游轮行程给我)

答案 2 :(得分:1)

您还可以使用Apple引用中描述的NSDateComponents类:

  

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

     

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

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

答案 3 :(得分:0)

不要将NSDate值与NSLog等格式化输出混淆。 NSDate是GMT,Apple的文档:

  

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

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

答案 4 :(得分:-1)

        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);