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

发布于 2024-12-27 03:05:53 字数 1820 浏览 1 评论 0原文

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 库上是否有预定义的方法来执行此操作。如果有的话我想使用它。你能告诉我有更简单的方法吗?或者,如果您确认这是最简单的方法,我们将非常感激:)

Youtube API returns date string in RFC3339 format. I found how to parse it on manual, anyway, this is too long.

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

I can make a function contains this, but I want to know is there pre-defined way on Cocoa foundations or standard C or POSIX library to do this. And I want to use it if there it is. Can you let me know is there more simpler way? Or It will be very appreciate if you confirm this is most simple way :)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

你又不是我 2025-01-03 03:05:53

纯粹的可可附带的东西正是您正在做的。您可以通过在其他地方(可能在 init 中)创建日期格式化程序,并在此方法中使用/重用它们,使该方法变得更短、更快。

The pure stuff-that-comes-with-Cocoa way is exactly what you're doing. You can make this method both shorter and faster by creating the date formatters elsewhere, probably in init, and using/reusing them in this method.

℉絮湮 2025-01-03 03:05:53

您需要两种格式,因为秒的小数部分是可选的,并且时区应该是 Z5,而不是 Z。因此,您使用格式创建两个格式化程序

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

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

You need two formats because fractional seconds are optional, and the timezone should be Z5, not Z. So you create two formatters with formats

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

and try them both. That's obviously for RFC3339; your strings might not be in that format. Glad you didn't ask for RFC822 which is a pain to do correctly. But you should really have a method first that returns NSDate, because most uses don't actually need a string formatted for the user.

一刻暧昧 2025-01-03 03:05:53

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

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

I had some problems with parsing RFC 3339 in Obj-c since the fractional seconds and zone seems to be optional.

The most reliable function that I found was this Gist (of which I am not the author): https://gist.github.com/mwaterfall/953664

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文