有没有一种简单的方法将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”