Какой самый простой способ разобрать строку даты RFC3339 в iOS? - PullRequest
4 голосов
/ 16 января 2012

Youtube API возвращает строку даты в формате RFC3339. Я нашел, как разобрать его в ручную, во всяком случае, это слишком долго.

- (NSString *)userVisibleDateTimeStringForRFC3339DateTimeString:(NSString *)rfc3339DateTimeString
    // Returns a user-visible date time string that corresponds to the
    // specified RFC 3339 date time string. Note that this does not handle
    // all possible RFC 3339 date time strings, just one of the most common
    // styles.
{
    NSString *          userVisibleDateTimeString;
    NSDateFormatter *   rfc3339DateFormatter;
    NSLocale *          enUSPOSIXLocale;
    NSDate *            date;
    NSDateFormatter *   userVisibleDateFormatter;

    userVisibleDateTimeString = nil;

    // Convert the RFC 3339 date time string to an NSDate.

    rfc3339DateFormatter = [[[NSDateFormatter alloc] init] autorelease];

    enUSPOSIXLocale = [[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"] autorelease];

    [rfc3339DateFormatter setLocale:enUSPOSIXLocale];
    [rfc3339DateFormatter setDateFormat:@"yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'"];
    [rfc3339DateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];

    date = [rfc3339DateFormatter dateFromString:rfc3339DateTimeString];
    if (date != nil) {

        // Convert the NSDate to a user-visible date string.

        userVisibleDateFormatter = [[[NSDateFormatter alloc] init] autorelease];
        assert(userVisibleDateFormatter != nil);

        [userVisibleDateFormatter setDateStyle:NSDateFormatterShortStyle];
        [userVisibleDateFormatter setTimeStyle:NSDateFormatterShortStyle];

        userVisibleDateTimeString = [userVisibleDateFormatter stringFromDate:date];
    }
    return userVisibleDateTimeString;
}

Я могу сделать так, чтобы функция содержала это, но я хочу знать, есть ли предопределенный способ на основаниях Какао или стандартной библиотеке C или POSIX, чтобы сделать это. И я хочу использовать его, если он есть. Можете ли вы дать мне знать, есть ли более простой способ? Или будет очень признателен, если вы подтвердите, что это самый простой способ:)

Ответы [ 3 ]

2 голосов
/ 15 мая 2014

Вам нужны два формата, потому что дробные секунды необязательны, а часовой пояс должен быть Z5, а не Z. Таким образом, вы создаете два форматера с форматами

@"yyyy'-'MM'-'dd'T'HH':'mm':'ssX5"
@"yyyy'-'MM'-'dd'T'HH':'mm':'ss.SSSSSSX5"

и попробуйте оба. Это очевидно для RFC3339; Ваши строки могут быть не в этом формате. Рад, что вы не просили RFC822, который является болью, чтобы делать правильно. Но сначала у вас должен быть метод, возвращающий NSDate, потому что большинству пользователей не нужна строка, отформатированная для пользователя.

2 голосов
/ 16 января 2012

Чистый способ, который идет с какао, это именно то, что вы делаете. Вы можете сделать этот метод как более коротким, так и более быстрым, создав в других местах форматеры даты, вероятно, в init, и используя / повторно используя их в этом методе.

1 голос
/ 15 мая 2014

У меня были некоторые проблемы с синтаксическим анализом RFC 3339 в Obj-c, поскольку дробные секунды и зона, по-видимому, необязательны.

Самой надежной функцией, которую я нашел, была эта Гиста (которой я не являюсь автором): https://gist.github.com/mwaterfall/953664

...