Неверное время от NSDateFormatter

У меня есть строка, из которой я хочу проанализировать время:

NSString *longdate = @"Mar 27, 2011 8:38:38 PM";

Я хочу разобрать эту дату и вывести только часть времени с часами+минутами+am/pm:

// First, convert our string into an NSDate
NSDateFormatter *inFormat = [[NSDateFormatter alloc] init];
[inFormat setDateFormat:@"MMM dd, yyyy HH:mm:ss aaa"];
NSDate *date = [inFormat dateFromString:longdate];
[inFormat release];

// Now convert from date back to a string
NSDateFormatter *outFormat = [[NSDateFormatter alloc] init];
[outFormat setDateFormat:@"HH:mm aaa"];
NSString *final = [outFormat stringFromDate:date];
[outFormat release];

NSLog(@"original: %@ | final %@", longdate, final);

Проблема в том, что последнее время неверно. Я ожидаю, что время будет 20:38, но вместо этого получаю 12:38.

Я просто хочу получить тот же час, что и я, и не беспокоиться о каких-либо часовых поясах или локалях. Что я здесь делаю неправильно? Спасибо.


person DOOManiac    schedule 29.03.2011    source источник


Ответы (3)


Нашел проблему. Не имел ничего общего с часовыми поясами и все, что связано с использованием неправильных кодов форматирования для средства форматирования даты.

[inFormat setDateFormat:@"MMM dd, yyyy HH:mm:ss aaa"];

должно быть:

[inFormat setDateFormat:@"MMM dd, yyyy h:mm:ss aaa"];

Точно так же формат даты outFormat должен быть:

[outFormat setDateFormat:@"h:mm aaa"];

После этой настройки все работает нормально даже без каких-либо настроек TimeZone.

person DOOManiac    schedule 29.03.2011

Как сказал Дэйв, проверьте свои часовые пояса. Вы также можете указать форматировщику даты использовать ваш текущий часовой пояс:

[outFormat setTimeZone:[NSTimeZone localTimeZone]];
person Jeremy Brooks    schedule 29.03.2011

Вы перепутали часовые пояса. IIRC, NSDateFormatter (по умолчанию) будет анализировать материал в часовом поясе UTC (+000), но даты NSLogged в вашем текущем часовом поясе. Или что-то вроде того.

В любом случае, проверьте свои часовые пояса.

person Dave DeLong    schedule 29.03.2011