NSDate независимо от часового пояса?

7

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

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

Заранее благодарим за помощь.

    
задан Rog 11.10.2011 в 02:09
источник

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
    
ответ дан bryanmac 11.10.2011 в 02:43
2

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

Ссылка :

(b.t.w., я был бы поражен, если бы был паром, который включал пересечение четырех часовых поясов, звучит как круизный корабль для меня)

    
ответ дан Michael Dautermann 11.10.2011 в 02:12
1

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

  

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

     

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

Ссылка

    
ответ дан YoCoh 05.07.2012 в 22:34
0

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

  

Единственный примитивный метод NSDate, timeIntervalSinceReferenceDate,   обеспечивает основу для всех других методов в интерфейсе NSDate.   Этот метод возвращает значение времени относительно абсолютной ссылки   дата - первый момент 1 января 2001 года, 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
    
ответ дан zaph 11.10.2011 в 02:24
-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);
    
ответ дан vualoaithu 06.03.2013 в 05:22