NSDate независимо от часового пояса? - PullRequest
8 голосов
/ 11 октября 2011

У меня есть приложение, которое отображает расписание определенных поездок на пароме.

Если я отправляюсь в другой часовой пояс - скажем, на 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 ]

7 голосов
/ 11 октября 2011

Вам необходимо сохранить часовой пояс, в котором проходит поездка на пароме, и отформатировать его для этого часового пояса.

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
2 голосов
/ 11 октября 2011

Вы видели метод setTimeZone NSDateFormatter, да?

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

(кстати, я был бы удивлен, если бы был паром, пересекающий четыре часовых пояса;маршрут круиза ко мне)

1 голос
/ 06 июля 2012

Вы также можете использовать класс NSDateComponents, как описано в справке Apple:

Если вам нужно создать дату, независимую от часового пояса, вы можете сохранить дату как объект NSDateComponents - при условии сохранения некоторой ссылки на соответствующий календарь.

В iOS объекты NSDateComponents могут содержать календарь, часовой пояс и объект даты. Поэтому вы можете хранить календарь вместе с компонентами. Если вы используете метод date класса NSDateComponents для доступа к дате, убедитесь, что соответствующий часовой пояс обновлен.

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

0 голосов
/ 06 марта 2013
        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);
0 голосов
/ 11 октября 2011

Не путайте значение NSDate с форматированным выводом, таким как NSLog. NSDate - GMT, документы Apple:

Единственный примитивный метод NSDate, timeIntervalSinceReferenceDate, обеспечивает основу для всех других методов в интерфейсе NSDate. Этот метод возвращает значение времени относительно абсолютной ссылки дата - первый момент 1 января 2001 года, время по Гринвичу.

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
...