Какой самый простой способ разобрать строку даты RFC3339 в iOS?
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 ответа
То, что вы делаете вместе с Какао, - это именно то, что вы делаете. Вы можете сделать этот метод как более коротким, так и более быстрым, создав средства форматирования даты в другом месте, вероятно, в init
и используя / повторно используя их в этом методе.
Вам нужны два формата, потому что дробные секунды необязательны, а часовой пояс должен быть Z5, а не Z. Таким образом, вы создаете два форматера с форматами
@"yyyy'-'MM'-'dd'T'HH':'mm':'ssX5"
@"yyyy'-'MM'-'dd'T'HH':'mm':'ss.SSSSSSX5"
и попробуй их обоих. Это очевидно для RFC3339; Ваши строки могут быть не в этом формате. Рад, что вы не просили RFC822, который является болью, чтобы делать правильно. Но сначала у вас должен быть метод, возвращающий NSDate, потому что большинству пользователей не нужна строка, отформатированная для пользователя.
У меня были некоторые проблемы с синтаксическим анализом RFC 3339 в Obj-c, поскольку доли секунды и зона, кажется, необязательны.
Самой надежной функцией, которую я нашел, была эта Gist (автором которой я не являюсь): https://gist.github.com/mwaterfall/953664