2012-01-16 3 views
4

Youtube API возвращает строку даты в формате RFC3339. Во всяком случае, я нашел, как его разобрать вручную.Каков самый простой способ разобрать строку даты RFC3339 в iOS?

- (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, чтобы сделать это. И я хочу использовать его, если он есть. Можете ли вы сообщить мне, есть ли более простой способ? Или будет очень признателен, если вы подтвердите, что это самый простой способ :)

ответ

2

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

+0

К сожалению, этот код не может обрабатывать фракционную часть секунд, когда я тестировал один раз ... – Eonil

+0

@Eonil: Вам нужно изменить строку формата. Существует символ формата, определенный для дробных секунд в соответствующей спецификации: http://unicode.org/reports/tr35/tr35-10.html#Date_Format_Patterns –

+0

О, это выглядит красиво. Я попробую это :) – Eonil

1

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

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

2

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

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

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

Смежные вопросы