【问题标题】:What's the right way to parse an ISO8601 date in cocoa?在可可中解析 ISO8601 日期的正确方法是什么?
【发布时间】:2011-06-01 00:24:07
【问题描述】:

我想在 Cocoa 中解析 ISO8601 日期,适用于 iOS 4+ 和 OSX 10.6+

StackOverflow 上已经有一些关于此的问题,但在我看来,没有一个包含好的答案。我认为这是一个很好的答案:

  1. 答案应该指向支持 ISO8601 的代码。此代码应在 XCode 4 下为 iOS 4+ 和 OSX 10.6+ 编译干净。

  2. 代码应支持所有可能的 ISO8601 日期格式。

    请注意,这里有很多很多可能性。简单地用一两个格式字符串回答NSDateFormatter 并不会减少它。

  3. 答案应该this library。那是因为它充满了危险的 32 位假设,它比必要的复杂得多,而且它不能用 XCode4/Clang 编译干净。底线:我根本不相信它!

谢谢,可可们。我很高兴知道这里是否有真正的答案!

【问题讨论】:

    标签: objective-c cocoa ios macos iso8601


    【解决方案1】:

    最好的方法是this library。 ☺

    我应该在该页面上添加一个指向the Bitbucket repo 的链接,其中包含更新的源代码(包括 32 位和 Clang 修复!)并且有一个问题跟踪器。如果您在其中发现任何其他错误,请提交。

    我也想知道您所说的“比必要的更复杂”是什么意思。正常使用很简单:

    ISO8601DateFormatter *formatter = [[[ISO8601DateFormatter alloc] init] autorelease]; //Or, if you prefer, create it once in -init and own it until -dealloc 
    NSDate *parsedDate = [formatter dateFromString:inString];
    NSString *unparsedString = [formatter stringFromDate:inDate];
    

    如果您需要更多信息(例如,保留时区),您可以将dateFromString:stringFromDate: 换成更长的方法之一。

    如果你的意思是别的,我想听听,以便改进图书馆。

    【讨论】:

    • 哈!嗨,彼得。太好了,我会看看 Bitbucket 上的代码,看看它是如何运行的。通过“比必要的复杂”,我不得不承认:我的意思是经过目视检查后,我认为您的库的代码可能难以维护。对我来说,它不像干净、模块化、结构良好的代码那样“阅读”。再加上 32/64 的问题,我说服了我去别处。也就是说,ISO8601 是一个棘手的野兽,解析器也是如此……所以我很高兴在这一点上得到纠正,可能是告诉我编写自己的该死的 ISO8601 解析器。 ;-)
    • 是的,它不漂亮。每个主要的工作方法都很长,有六个 goto。理想情况下,我可能会使用一个或三个正则表达式进行解析;鉴于 Cocoa 还没有内置的正则表达式 API(只有 Cocoa Touch 有),如果我决定为了好玩而重写它,我可能会制作某种自定义状态机。尽管如此,我认为更高的优先级是切换到 SenTestingKit 进行测试。当前代码有效,但在考虑替换实现之前,我希望测试和重新测试更容易。 (顺便说一句:make test 运行当前测试。)
    • 我现在使用的是在 Bitbucket 上找到的这个库的版本。它可以干净地编译,并且从我有限的测试来看,它似乎可以工作。 @Peter,您应该绝对更新您的网站以指向 bitbucket——这将帮助人们意识到您的库仍在维护。 (事实上​​,bitbucket repo 基本上是找不到的。)除非有人在接下来的几天内对我的问题提出不同的答案,否则我会将@Peter 的答案标记为已接受的答案!
    • @Dave Peck:我已更新页面以包含指向 Bitbucket 的链接。
    • 这个库似乎有些缺陷:-(如果我错了请纠正我,但我绝对没有看到时间或时区解析测试,这些似乎是我使用时在 iOS 上损坏的区域这段代码。它不会生成有效的 ISO8601 时间,也不会以当前形式解析它们。我还没有工作补丁,但如果我得到一个,我会添加另一条评论。我已经提出了初始问题跟踪器上的错误。
    猜你喜欢
    • 2012-10-28
    • 1970-01-01
    • 2015-09-23
    • 1970-01-01
    • 1970-01-01
    • 2012-07-30
    • 1970-01-01
    • 2020-09-23
    • 1970-01-01
    相关资源
    最近更新 更多