有没有一种简单的方法将ISO8601时间戳转换为格式化的NSDate?

如果我使用下面的代码:

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm"]; NSDate *myDate = [dateFormatter dateFromString:@"2010-01-28T15:22:23.863"]; NSLog(@"%@", [dateFormatter stringFromDate:myDate]); 

它被成功地转换为一个Date对象,但是,我似乎无法格式化比yyyy-MM-dd'T'HH:mm ,即什么得到logging2010-01-28T15:22:23

如果我将dateFormat更改为[dateFormatter setDateFormat:@"yyyy-MMMM-d'T'HH:mm"]; Date对象为null …

所以我最终的问题是如何从SQL数据库中格式化ISO8601时间戳,例如使用NSDateFormatterMediumStyle返回“2010年1月1日”?

您需要另一个格式化程序来处理输出。 把这个放在你的代码后面:

 NSDateFormatter *anotherDateFormatter = [[NSDateFormatter alloc] init]; [anotherDateFormatter setDateStyle:NSDateFormatterLongStyle]; [anotherDateFormatter setTimeStyle:NSDateFormatterShortStyle]; NSLog(@"%@", [anotherDateFormatter stringFromDate:myDate]); 

我有一个类似的,但稍微复杂的问题,我find了一个非常简单的解决scheme!

问题:我的传入ISO8601date如下所示: 2006-06-14T11:06:00+02:00他们在最后有一个时区偏移量。

解决scheme:使用Peter Hosey的ISO8601DateFormatter ,您可以从这里下载。

 ISO8601DateFormatter *formatter = [[ISO8601DateFormatter alloc] init]; NSDate *theDate = [formatter dateFromString:dateString]; [formatter release], formatter = nil; 

 ISO8601DateFormatter *formatter = [[ISO8601DateFormatter alloc] init]; NSString *dateString = [formatter stringFromDate:[twitch dateTwitched]]; [formatter release], formatter = nil; 

这里是来自苹果的示例代码

  NSDateFormatter * formatter = [[NSDateFormatter alloc] init]; [formatter setDateFormat:@"yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'"]; NSDate *date = [formatter dateFromString:dateString]; 

链接: https : //developer.apple.com/library/ios/#qa/qa1480/_index.html

只要提到,自iOS 6.0以来,你可以使用这种格式:

  yyyy-MM-dd'T'HH:mm:ssZZZZZ 

我有一个非常快速的parsingISO8601 NSStrings到SAMCategories的NSDates的 C实现。 你可以用CocoaPods来安装它,或者把这些文件复制到你的项目中。

以下是如何使用它:

[NSDate sam_dateFromISO8601String:@"2013-08-24T06:51:21-07:00"]

这是非常强大的,支持缺less时区等。就像我上面的评论所说,NSDateFormatterparsing很多date时是非常缓慢的。 切换到这个实施帮助了巨大的数额。

这个代码被用于6个生产应用程序(包括Hipstamatic和Roon ),我已经在没有已知问题的工作。 有一个testing套件来防止回归。

总之,我认为这是在Objective-C中parsingISO8601string的最好方法。


另外,如果您担心性能和传输问题,则最好使用整数而不是ISO8601string。 你可以简单地将它们转换成date[NSDate dateWithTimeIntervalSince1970:yourInteger] 。 性能是尽可能快,并有less量字符转移通过电线。

我应该注意到,上次我检查苹果NSDate方法不支持ISO8601。 我仍然有一个与苹果有关的官方支持的错误。

+ (id)dateWithNaturalLanguageString:(NSString *)string

将正确(上次我跑它)parsing并创build一个ISO801string的NSDate对象,虽然文档说,你不应该使用它,它的工作到目前为止我已经尝试过的所有ISO8601date。

@danielbeard答案为我工作。 但是,您需要包括时区,否则它会将UTCdate转换为您当前的时区,而不是您想要的。

 - (NSDate *) dateFromISO8601DateString:(NSString *) dateString { NSDateFormatter * dateFormatter = [NSDateFormatter new]; dateFormatter.timeZone = [NSTimeZone timeZoneWithName:@"UTC"]; [dateFormatter setDateFormat:@"yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'"]; NSDate * date = [dateFormatter dateFromString:dateString]; return date; } 

@Thread队长试试这个格式:“yyyy-MM-dd'T'HH:mm:ss.SSS”