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

rso*_*son 46 objective-c iso8601 nsdate nsdateformatter

如果我使用以下代码:

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]);
Run Code Online (Sandbox Code Playgroud)

它成功地转换为一个Date对象,但是,我似乎无法以任何其他方式格式化它yyyy-MM-dd'T'HH:mm,即记录的是什么2010-01-28T15:22:23

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

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

Mat*_*hew 42

我有一个类似但稍微复杂的问题,我找到了一个非常简单的解决方案!

问题: 我的传入ISO8601日期如下所示:2006-06-14T11:06:00+02:00它们在末尾有一个时区偏移量.

解决方案: 使用Peter Hosey的ISO8601DateFormatter,您可以从这里下载.

ISO8601DateFormatter *formatter = [[ISO8601DateFormatter alloc] init];
NSDate *theDate = [formatter dateFromString:dateString];
[formatter release], formatter = nil;
Run Code Online (Sandbox Code Playgroud)

ISO8601DateFormatter *formatter = [[ISO8601DateFormatter alloc] init];
NSString *dateString = [formatter stringFromDate:[twitch dateTwitched]];
[formatter release], formatter = nil;
Run Code Online (Sandbox Code Playgroud)

  • 更新:它现在[更快](http://t.co/mT25yJpX).不再需要7-8秒. (4认同)
  • @pixelfreak:机会是100%.我上个月采取了行动.https://github.com/boredzo/iso-8601-date-formatter (4认同)
  • ISO8601DateFormatter运行良好,但速度极慢.在我的测试中,NSDateFormatter 300ms的解析采用了ISO8601DateFormatter 7400ms. (3认同)
  • @GangstaGraham:你可以打开格式化程序的`includeTime`属性. (3认同)

小智 19

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

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


dav*_*vid 19

这是来自apple的示例代码

    NSDateFormatter * formatter = [[NSDateFormatter alloc] init];
    [formatter setDateFormat:@"yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'"];
    NSDate *date = [formatter dateFromString:dateString];
Run Code Online (Sandbox Code Playgroud)

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


Mar*_*cin 12

仅举几例,自iOS 6.0起,您可以使用以下格式:

 yyyy-MM-dd'T'HH:mm:ssZZZZZ
Run Code Online (Sandbox Code Playgroud)

  • @macbirdie我可以确认NSDateFormatter正确解析了由单个'Z'指定的日期.测试字符串"2010-01-28T15:22:23Z"使用日期格式"yyyy-MMMM-d'T'HH:mm:ssZZZZZ".我的测试平台是iOS7.'Z'格式在Unicode标准中是特殊的. (3认同)

Sam*_*fes 6

我有一个非常快速的C实现,将ISO8601 NSStrings解析为SAMCategories中的NSDates.您可以使用CocoaPods安装它,或者只是将文件复制到您的项目中.

以下是如何使用它:

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

它非常强大并且支持缺少时区等.就像我上面的评论所说,在解析大量日期时,NSDateFormatter对我来说非常慢.切换到这种实现有很大帮助.

此代码用于我已经处理过的6个生产应用程序(包括Hipstamatic和Roon),没有任何已知问题.有一个测试套件可以防止回归.

简而言之,我认为这是在Objective-C中解析ISO8601字符串的最佳方法.


简而言之,如果您关注性能和传输,则首选发送整数而不是ISO8601字符串.你可以简单地将它们转换为日期[NSDate dateWithTimeIntervalSince1970:yourInteger].性能和您一样快,并且通过线路传输的字符更少.


Col*_*ler 5

我应该注意,上次我检查苹果NSDate方法时不支持ISO8601.我仍然有一个关于提供官方支持的苹果公司的错误.

+ (id)dateWithNaturalLanguageString:(NSString *)string

将正确(上次我运行它)解析并NSDate从ISO801字符串创建一个对象,虽然文档说你不应该使用它,它适用于我迄今为止尝试过的所有ISO8601日期.