8

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

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

在此先感谢您的帮助。

4

5 回答 5

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
于 2011-10-11T00:43:09.030 回答
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

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

于 2011-10-11T00:12:51.050 回答
1

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

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

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

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

于 2012-07-05T20:34:19.563 回答
0

不要将 NSDate 值与 NSLog 之类的格式化输出混淆。NSDate 是格林威治标准时间,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
于 2011-10-11T00:24:53.607 回答
-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);
于 2013-03-06T04:22:23.677 回答