мой NSDateFormatter работает только в симуляторе iPhone - PullRequest
2 голосов
/ 08 мая 2009

Я использую NSDateFormatter, который отлично работает в симуляторе, но я получаю ноль, когда я запускаю его в iPhone. Я жестко закодировал дату, чтобы быть уверенным в формате, но в любом случае это не удалось.

NSString *strPubDate = @"Fri, 8 May 2009 08:08:35 GMT";
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setFormatterBehavior:NSDateFormatterBehavior10_4];
[dateFormatter setDateFormat:@"EEE, d MMM yyyy HH:mm:ss Z"];

NSDate *myDate = [dateFormatter dateFromString:strPubDate];

Я пытался с различными настройками региона, языков и т. Д. На iPhone. Есть идеи, что не так?

Ответы [ 7 ]

9 голосов
/ 02 октября 2009

Похоже, что этот код корректно работает с тегом "GMT".

NSString *strPubDate = @"Fri, 8 May 2009 08:08:35 GMT";
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"EEE, d MMM yyyy HH:mm:ss zzzz"];
NSDate *myDate = [dateFormatter dateFromString:strPubDate];

RFC822 Спецификации даты и времени использовать несколько тегов "zone", и я нашел правильный символ для анализа тега "GMT" Формат строки для iPhone NSDateFormatter

  • z ~ zzz: (Аббревиатура часового пояса по Гринвичу)
  • zzzz: (название часового пояса по Гринвичу)
  • Z: +0000 (часовой пояс RFC 822

Спасибо за вашу помощь!

2 голосов
/ 07 декабря 2011

У меня тоже недавно была эта проблема (iOS5). Мне нужно было также установить локаль NSDateFormatter для работы на устройстве. Без этого [dateFormatServer dateFromString:dateServer] возвращал ноль.

NSString *dateServer = @"Fri, 8 May 2009 08:08:35 GMT";

NSDateFormatter *dateFormatServer = [[NSDateFormatter alloc] init];
[dateFormatServer setDateFormat:@"EEE, d MMM yyyy HH:mm:ss zzzz"];

NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_GB"];
[dateFormatServer setLocale:locale];
[locale release];

NSDate * date = [dateFormatServer dateFromString:dateServer];
2 голосов
/ 08 мая 2009

Если вам нужно использовать определенный формат даты, вы можете проанализировать его «вручную», а не с помощью NSDateFormatter. Его поведение меняется в зависимости от локали и т. Д., И есть некоторые ошибки, особенно когда в строке есть часовой пояс.

Сказав это, один из способов найти проблему может заключаться в использовании метода getObjectValue:forString:range:error: вместо dateFromString:. Таким образом, вы получите NSError объект, который (в теории) скажет вам, в чем проблема.

Кстати, вам не нужна строка NSDateFormatterBehavior10_4. iPhone OS поддерживает только опции 10.4+, но вы не получите никаких ошибок, если будете использовать «старый» стиль в симуляторе.

1 голос
/ 08 мая 2009

Когда я анализировал строку даты с «GMT» в конце, я использовал формат «zzz», а не «Z».

1 голос
/ 08 мая 2009

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

0 голосов
/ 16 апреля 2010

strptime спас меня тоже.

struct tm time;
if (strptime([modDateString UTF8String], "%A, %d %b %Y %H:%M:%S", &time)) {
            NSString *rDate=[NSString stringWithFormat:@"%04d-%02d-%02d %02d:%02d:%02d +0000",
                             time.tm_year+1900, time.tm_mon+1, time.tm_mday,
                             time.tm_hour, time.tm_min, time.tm_sec];

Этот код работает с HTTP-датами, такими как четверг, 15 апреля 2010 г., 13:53:56 по Гринвичу и пт, 8 мая 2009 г., 08:08:35 по Гринвичу, который был первоначальным вопросом

0 голосов
/ 29 сентября 2009

Я второй совет Мануэля Спулера о синтаксическом анализе вручную - не мой любимый вариант, но параметры Objective-C для этого слишком сложны (и не хватает отчетов об ошибках - что-то не так просто плюет nil, без намека на ошибку) .

Одна вещь, которая сработала для меня, это использование C * strptime, чтобы отделить дату, а затем реконструировать ее как NSDate объект. Например, приведенный ниже код обрабатывает строку, полученную как что-то вроде «Monday, 28-Sep-09 18:13:50 UTC», и преобразует ее в объект NSDate, адаптирующий время UTC для местного времени:

    struct tm time;
    strptime([currentStringValue UTF8String], "%A, %d-%b-%y %H:%M:%S %z", &time);   
    NSDate* myDate = [NSDate dateWithString:
        [NSString stringWithFormat:@"%04d-%02d-%02d %02d:%02d:%02d +0000",
            time.tm_year+1900, time.tm_mon+1, time.tm_mday,
            time.tm_hour, time.tm_min, time.tm_sec]
    ];

(может обрабатывать другие зоны, добавив другие параметры struct tm вместо фиксированного часового пояса +0000, подробности см. В записи time.h в википедии ):

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