У меня был следующий код, продолжающий работать на ОС 3.x
NSString *stringDate = @"2010-06-21T20:06:36+00:00";
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZ"];
NSDate *theDate = [dateFormatter dateFromString:stringDate];
NSLog(@"%@",[dateFormatter stringFromDate:theDate]);
но теперь в новейшем XCode 3.2.3 под iOS4 средством моделирования, varialble theDate является нолем.
Я просмотрел ссылку класса и не вижу ничего удержанного от использования или реализованного по-другому для iOS4 с этими определенными методами. Что я не учитывал?
На вашем устройстве установлено 24-часовое или 12-часовое время?
Это звучит как безумный вопрос, но я только что столкнулся с этой ошибкой - форматтер даты настроит вашу строку формата в соответствии с текущим языковым стандартом, который будет включать настройки формата времени.
Вы можете заставить его игнорировать их, добавив эту строку:
dateFormatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];
Надеюсь, что это поможет.
Мне нравится.
Правильно ли он работает на реальном устройстве?
Если да, отправьте отчет об ошибке для симулятора, в противном случае отправьте отчет об ошибке для iOS 4.
Я только что отлаживал ту же самую проблему. У меня та же строка даты, что и у вас, которая работает в 3.x, а не в 4.0. Те же симптомы.
Просматривая документацию NSDateFormatter, я вижу:
Инициализация средства форматирования даты - init Доступно в iPhone OS 2.0 через iPhone OS 3.2
Это говорит о том, что метод init устарел для iOS 4.0. Я не совсем понимаю, что это значит.
Я получаю значение из dataFormat @ "yyyy '-' MM '-' dd'T'HH ':' mm ':' ss '+' hh: mm"
;
Недавно я столкнулся с этой проблемой. В итоге я использовал синтаксический анализатор ISO8601 Питера Хози. Он доступен здесь: http://boredzo.org/iso8601unparser/
Ссылка, которую разместил Элфред, помогла. Я столкнулся с той же проблемой во время конвертации моего приложения с 3.1.3 на iOS4. По ссылке находится класс ISO8601DateFormatter, который является более совершенным расширением, чем мой собственный класс утилиты даты.
Elfred пишет: Недавно я столкнулся с этой проблемой. В итоге я использовал парсер ISO8601 от Питера Хоси. Его можно найти здесь: http://boredzo.org/iso8601unparser/
Предоставляемый мне формат находится на полпути между RFC 822 и GMT. если я изменю «+00: 00» на «+0000», я могу использовать «Z» в моем формате. и если я изменю его на «GMT + 00: 00», я могу использовать ZZZZ для правильного получения данных. Кажется, что-то было вырезано, чтобы справиться с этим гибридом, поскольку он работал у меня раньше с OS 3.x.
Похоже, NSDateFormatter стал очень разборчивым.
-(void)dateFormatterTests {
NSDateFormatter *formatter;
formatter = [[NSDateFormatter alloc] init];
#ifdef WORKS
[formatter setDateFormat:@"yyyy-MM-dd"];
#elif defined(ALSO_WORKS)
[formatter setDateFormat:@"yyyy MM dd"];
[formatter setLenient:YES];
#else // DOESN'T WORK
[formatter setDateFormat:@"yyyy MM dd"];
#endif
// Works per comments above
NSLog(@"dFS: %@", [formatter dateFromString:@"2010-01-13"]);
// Never works with any of the above formats
NSLog(@"dFS: %@", [formatter dateFromString:@"2010-01-13 22:00"]);
[formatter release]; formatter = nil;
}
У меня была такая же проблема в моих приложениях Нулевое значение из NSDateFormatter .
Моя проблема заключалась в следующем:
Я отправлял своему приложению дату и время вроде этого: 16.07.2010 04:21:00 +00: 00
с помощью средства форматирования вот так: [dateFormatter setDateFormat: @ "MM / dd / yyyy HH: mm: ss ZZZ"]
Похоже, что часть форматирования ZZZ
НЕ ДОЛЖНА принимает двоеточие: in время.
Работает: 16.07.2010 04:21:00 +0000
Не работает: 16.07.2010 04:21:00 +00: 00
В службу поддержки текущие вышедшие приложения, все, что я сделал, это поискал часть +00: 00
в строке и заменил ее на +0000
.
Надеюсь, это поможет другим.
Этот код удалит лишнее двоеточие, как описывает AtomRiot:
Преобразование из:
NSString * stringDate = @ "2010-06-21T20: 06: 36 + 00: 00 ";
to:
NSString * stringDate = @" 2010-06-21T20: 06: 36 + 0000 ";
// Remove colon in timezone as iOS 4+ NSDateFormatter breaks
if (stringDate.length > 20) {
stringDate = [stringDate stringByReplacingOccurrencesOfString:@":"
withString:@""
options:0
range:NSMakeRange(20, stringDate.length-20)];
}
подробнее см .: https: // devforums .apple.com / thread / 45837