NSDateFormatter и преобразование даты не работает - PullRequest
2 голосов
/ 02 февраля 2010

Я занимаюсь разработкой приложения для iPhone, в котором мне нужно преобразовать дату из XML-канала в формат HH: MM.

У меня есть следующий метод, который не работает, и я понятия не имею, что я делаю неправильно.

Например, строка timeToConvert будет выглядеть так: « Пн, 01.02.2010 21:55:00 + 0100 » (без кавычек)

Этот метод работает, когда для региона задано значение США (я получаю верную дату), но не когда я изменяю регион (в Настройки-> Общие-> Международные) на Испанию или другие регионы (в этом случае вернись ноль).

- (id)timeConvertToHHMM:(NSString *)timeToConvert {

    NSString *newPubDate = timeToConvert;
    //Let's remove any rubbish from the code
    newPubDate = [newPubDate stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
    //create formatter and format to convert the XML string to an NSDate
    NSDateFormatter *originalDateFormatter = [[[NSDateFormatter alloc] init] autorelease];
    [originalDateFormatter setDateFormat:@"EEE, d MMM yyyy H:mm:ss z"];
    //run the string through the formatter
    NSDate *formattedDate = [[NSDate alloc] init];
    formattedDate = [originalDateFormatter dateFromString:newPubDate];
    //Let's now create another formatter to take the NSDate and convert format it to Hours and minutes
    NSDateFormatter *newDateFormatter = [[[NSDateFormatter alloc] init] autorelease];
    [newDateFormatter setDateFormat:@"HH:mm"]; // 24H clock set
    // And let's convert it back to a readable string
    NSString *calcHHMM = [newDateFormatter stringFromDate:formattedDate];
    NSLog(@"CalcHHMM: %@", calcHHMM);
    return calcHHMM;  
}

Любой намек на то, почему это не работает, и просто возвращение NULL будет более чем приветствоваться.

Ответы [ 2 ]

12 голосов
/ 02 февраля 2010

Похоже, проблема в том, что настройка вашего региона отличается от "en-US", поэтому средство форматирования даты не анализирует строку с использованием предоставленного формата en-US. Хотя может быть более элегантное общее решение, использование setLocale для originalDateFormatter для en_US может использоваться в качестве обходного пути для решения проблемы.

Как вы уже пробовали в своем коде:

[originalDateFormatter setLocale:[[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"] autorelease]];
2 голосов
/ 07 февраля 2011

У меня была точно такая же проблема. Моя проблема заключалась в том, что моя начальная строка даты имела один миллисекундный символ:

Пример: 2011-02-06 08:13:22:1

и анализируется в следующем формате: [formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];

Имитатор iPhone простил и успешно проанализировал дату за миллисекунды, однако при сборке на мой iphone это не так.
Изменение форматера на: [formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss.S"]; решило проблему.

...