通过 date('c')
在PHP中获取ISO 8601日期字符串(例如, 2004-02-12T15:19:21+00:00
)很容易,但是如何在Objective-C(iPhone)中获取它?是否有类似的简短方法呢?
这是我发现的漫长道路:
NSDateFormatter* dateFormatter = [[[NSDateFormatter alloc] init] autorelease];
dateFormatter.dateFormat = @"yyyy-MM-dd'T'HH:mm:ssZ";
NSDate *now = [NSDate date];
NSString *formattedDateString = [dateFormatter stringFromDate:now];
NSLog(@"ISO-8601 date: %@", formattedDateString);
// Output: ISO-8601 date: 2013-04-27T13:27:50-0700
对于如此重要的事情来说,这似乎是一件非常艰难的事情 .
10 回答
使用
NSDateFormatter
:在斯威夫特:
iOS 10引入了一个新的NSISO8601DateFormatter类来处理这个问题 . 如果您使用的是Swift 3,您的代码将是这样的:
作为maddy答案的补充,ISO 8601的时区格式应为“ZZZZZ”(5倍Z),而不是单个“Z”(用于RFC 822格式) . 至少在iOS 6上 .
(见http://www.unicode.org/reports/tr35/tr35-25.html#Date_Format_Patterns)
一个经常被忽视的问题是ISO 8601格式的字符串可能有毫秒而不是 .
换句话说,“2016-12-31T23:59:59.9999999”和“2016-12-01T00:00:00”都是合法的,但如果您使用的是静态类型的日期格式化程序,则其中一个将不会被解析 .
从 iOS 10 开始,您应该使用
ISO8601DateFormatter
来处理ISO 8601日期字符串的所有变体 . 见下面的例子:对于 iOS 9 and below ,请使用以下方法和多个数据格式化程序 .
我还没有找到一个涵盖这两个案例的答案,并且摘要了这个微妙的差异 . 以下是解决它的解决方案:
Usage:
我还建议检查Apple article关于日期格式化程序 .
所以在NSDate上使用Sam Soffee的类别找到here . 将代码添加到项目中后,您可以在NSDate上使用单个方法:
它不仅是一行,它比NSDateFormatter方法快得多,因为它是用纯C.写的 .
从IS8601,问题是表示和时区
ISO 8601 =
year-month-day time timezone
对于日期和时间,有基本(YYYYMMDD,hhmmss,...)和扩展格式(YYYY-MM-DD,hh:mm:ss,...)
时区可以是Zulu,偏移或GMT
日期和时间的分隔符可以是空格,或
T
日期有周格式,但很少使用
时区之后可以有很多空格
秒是可选的
这是一些有效的字符串
Solutions
一步一步解析,如soffes ISO8601
转换为基本格式,如onmyway133 ISO8601
NSDateFormatter
所以这是我在onmyway133 ISO8601中使用的格式
关于
Z
标识符Date Field Symbol Table关于
locale
Formatting Data Using the Locale Settings关于
en_US_POSIX
Technical Q&A QA1480 NSDateFormatter and Internet DatesInteresting related quetions
Converting an ISO 8601 timestamp into an NSDate: How does one deal with the UTC time offset?
Why NSDateFormatter can not parse date from ISO 8601 format
毫秒NSDateFormatter to parse ISO8601 with and without milliseconds
根据这个要点:https://github.com/justinmakaila/NSDate-ISO-8601/blob/master/NSDateISO8601.swift,可以使用以下方法将NSDate转换为ISO 8601日期字符串,格式为yyyy-MM-dd 'T' HH:mm:ss.SSSZ
只需使用Foundation框架中的 NSISO8601DateFormatter 即可 .
https://developer.apple.com/documentation/foundation/nsiso8601dateformatter?language=objc
这有点简单,并将日期放入UTC .
使用Swift 3.0和iOS 9.0