在iOS中解析RFC3339日期字符串的最简单方法是什么?

时间:2012-01-16 07:39:16

标签: objective-c cocoa date-formatting rfc3339

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;
}

我可以让一个函数包含这个,但我想知道Cocoa基础或标准C或POSIX库是否有预先定义的方法来执行此操作。如果它存在,我想用它。你能告诉我有更简单的方法吗?或者,如果您确认这是最简单的方式,将非常感激:)

3 个答案:

答案 0 :(得分:2)

纯粹的东西 - 与Cocoa一起来的正是你正在做的事情。您可以通过在其他位置(可能在init中创建日期格式化程序,并在此方法中使用/重复使用日期格式化程序来使此方法更短,更快。

答案 1 :(得分:2)

你需要两种格式,因为小数秒是可选的,时区应该是Z5,而不是Z.所以你创建两个格式为

的格式化器
@"yyyy'-'MM'-'dd'T'HH':'mm':'ssX5"
@"yyyy'-'MM'-'dd'T'HH':'mm':'ss.SSSSSSX5"

并尝试两者。这显然是针对RFC3339的;你的字符串可能不是那种格式。很高兴你没有要求RFC822这是正确的痛苦。但是你应该首先返回一个返回NSDate的方法,因为大多数用法实际上并不需要为用户格式化的字符串。

答案 2 :(得分:1)

我在Obj-c中解析RFC 3339时遇到了一些问题,因为小数秒和区域似乎是可选的。

我找到的最可靠的功能是这个要点(我不是作者):https://gist.github.com/mwaterfall/953664