iPhone - NSDate форматирование: странные значения времени и часовых поясов - PullRequest
4 голосов
/ 17 августа 2011

Я проверил эти звонки:

    NSLog(@"%@", [NSDate date]);
    NSLog(@"%@", [NSDate convertToUTC:[NSDate date]]);
    NSLog(@"%@", [[NSDate date] stringValueWithFormat:@"yyyyMMddHHmmss"]);
    NSLog(@"%@", [[NSDate convertToUTC:[NSDate date]] stringValueWithFormat:@"yyyyMMddHHmmss"]);

+ (NSDate*) convertToUTC:(NSDate*)sourceDate {
    [NSTimeZone resetSystemTimeZone];
    NSTimeZone* currentTimeZone = [NSTimeZone localTimeZone];
    NSTimeZone* utcTimeZone = [NSTimeZone timeZoneWithAbbreviation:@"UTC"];

    NSInteger currentGMTOffset = [currentTimeZone secondsFromGMTForDate:sourceDate];
    NSInteger gmtOffset = [utcTimeZone secondsFromGMTForDate:sourceDate];
    NSTimeInterval gmtInterval = gmtOffset - currentGMTOffset;

    NSDate* destinationDate = [[[NSDate alloc] initWithTimeInterval:gmtInterval sinceDate:sourceDate] autorelease];     
    return destinationDate;
}
- (NSString*) stringValueWithFormat:(NSString*)formatRetour {
    NSDateFormatter* dateFormatter = [[[NSDateFormatter alloc] init] autorelease];
    [dateFormatter setDateFormat:formatRetour];

    return [dateFormatter stringFromDate:self];
}

Они дают мне:

2011-08-17 13:03:58 +0000
2011-08-17 11:03:58 +0000
20110817150358
20110817130358

На моем телефоне все настроено на французский / французский, теперь: 15: 03: 58.

Я не понимаю, какие преобразования сделаны здесь.

1 дает мне реальное время в GMT
2 дает мне то, чего я не понимаю ...
3 дает в реальном времени на телефоне
4 дает реальное время в GMT

Я потерян ... Откуда приходит 2? Как работают эти звонки?
Я имею в виду, [дата NSDate] дает 13:03 с часовым поясом +0000. Почему форматирование показывает 15:03?
Почему 1 и 2 показывают часовой пояс +0000, но разные времена?

Не могли бы вы провести меня через это?

Ответы [ 2 ]

5 голосов
/ 17 августа 2011

NSLog всегда печатает описание объекта даты с часовым поясом +0000.

Когда вы используете NSDateFormatter, чтобы получить строку с вашей даты, он будет использовать часовой пояс вашего телефона. С "yyyyMMddHHmmssZZZ" вы бы получили 20110817150358+0200.

То же самое относится и к дате, которую вы конвертируете в UTC: вы получаете 11:03 для GMT + 0 (NSLog), что совпадает с 13: 03 + 0200 (с использованием NSDateFormatter).

Пока что convertToUTC: глючит, так как значение должно быть 13: 03 + 0000.

Методы преобразования NSDate в NSDate не имеют смысла. NSDate держит абсолютное время и не заботится о часовых поясах. При преобразовании NSString из / в NSDate необходимо учитывать только часовые пояса.

Вот почему, когда вы «convertToUTC» 15: 03 + 0200, вы получаете 13: 03 + 0200, что совпадает с 11: 03 + 0000.

Такой метод, как - (NSString *)UTCRepresentation будет иметь смысл, хотя.

0 голосов
/ 17 августа 2011

Не смущайтесь выводом NSLog. NSLog также нуждается в форматере для правильного отображения [NSDate date]. Если учесть, что в этом все должно иметь смысл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...