如何在cocoa中正确解析ISO8601日期?

7
我希望在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下编译。底线:我完全不信任它!

谢谢,Cocoa-ites同伴们。我很兴奋想知道这里是否有真正的答案!

1个回答

6
最好的方法是使用这个库。☺
我应该在那个页面上添加一个链接到Bitbucket存储库,其中包含更新的源代码(包括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:替换为更长的方法。

如果您有其他需求,请告诉我,以便我改进库。


1
哈!嗨,彼得。太好了,我会在Bitbucket上看看代码,看看情况如何。说“比必要复杂”,我不得不承认:我的意思是经过目视检查后,我认为你的库的代码可能很难维护。对我来说,它不像是干净、模块化、良好分解的代码。再加上32/64位的问题,这促使我去找别的替代方案。话虽如此,ISO8601是一个棘手的东西,解析器也是如此……所以如果有需要,我很乐意接受纠正,甚至告诉我写自己的ISO8601解析器。;-) - Dave Peck
我现在正在使用在Bitbucket上找到的这个库的版本。它可以编译,并且从我的有限测试中看来,似乎可以工作。@Peter,你应该绝对更新你的网站,指向bitbucket - 这将帮助人们意识到你的库仍然得到维护。(事实上,bitbucket存储库基本上是无法找到的。)除非在接下来的几天里有人提供不同的答案回答我的问题,否则我会将@Peter的答案标记为被接受的! - Dave Peck
@Dave Peck:我已经更新了页面,包括指向Bitbucket的链接。 - Peter Hosey
1
这个库似乎有点瑕疵 :-( 如果我错了请纠正我,但是我完全看不到关于时间或时区解析的测试,而当我在iOS上使用这段代码时,这些似乎是出问题的地方。它不能生成有效的ISO8601时间,也无法在其当前形式下解析它们。我还没有可行的修补程序,但如果我得到一个,我会再添加另一个评论。我已经在问题跟踪器上提出了初始错误报告。 - Roger
似乎正常工作。但我找不到任何关于如何更改输出字符串格式的文档。:( - Redfox
显示剩余8条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接