46

如果我使用以下代码:

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,即记录的内容是2010-01-28T15:22:23

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

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

4

8 回答 8

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;

ISO8601DateFormatter *formatter = [[ISO8601DateFormatter alloc] init];
NSString *dateString = [formatter stringFromDate:[twitch dateTwitched]];
[formatter release], formatter = nil;
于 2010-07-08T08:40:33.620 回答
19

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

NSDateFormatter *anotherDateFormatter = [[NSDateFormatter alloc] init];   
[anotherDateFormatter setDateStyle:NSDateFormatterLongStyle];
[anotherDateFormatter setTimeStyle:NSDateFormatterShortStyle];
NSLog(@"%@", [anotherDateFormatter stringFromDate:myDate]);
于 2010-02-04T17:46:03.297 回答
19

这是来自苹果的示例代码

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

链接:<a href="https://developer.apple.com/library/ios/#qa/qa1480/_index.html" rel="noreferrer">https://developer.apple.com/library/ios/ #qa/qa1480/_index.html

于 2012-09-24T11:30:28.730 回答
12

顺便提一下,从 iOS 6.0 开始,您可以使用这种格式:

 yyyy-MM-dd'T'HH:mm:ssZZZZZ
于 2013-06-28T10:53:02.177 回答
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]。性能尽可能快,并且通过网络传输的字符更少。

于 2013-08-24T13:52:20.617 回答
5

我应该注意到上次我检查 Apple 的NSDate方法不支持 ISO8601。我仍然对 Apple 有一个关于提供官方支持的错误。

+ (id)dateWithNaturalLanguageString:(NSString *)string

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

于 2010-02-05T04:06:39.937 回答
3

@danielbeard 回答对我有用。但是,您需要包含时区,否则它将 UTC 日期转换为您不想要的当前时区。

- (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;
}
于 2014-07-08T16:15:57.847 回答
2

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

于 2015-10-18T09:00:07.510 回答