如何使用NSDateFormatter和可选的毫秒部分解析ISO 8601

Dan*_*nds 17 objective-c ios

我正在尝试使用NSDateFormatter来解析这些格式中的任何一种格式的日期

@"2013-02-01T14:21:00"
Run Code Online (Sandbox Code Playgroud)

要么

@"2013-02-01T14:21:56.345"
Run Code Online (Sandbox Code Playgroud)

目前我使用下面的方法来解析字符串并返回一个日期:

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setTimeZone:[NSTimeZone timeZoneWithName:@"UTC"]];
[dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss"];

[dateFormatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]];
NSDate *date = [dateFormatter dateFromString:dateToFormat];
Run Code Online (Sandbox Code Playgroud)

这适用于第一种日期样式,但对于包含毫秒部分的字符串返回nil.

我想我可以测试毫秒的存在并剥离它们,但我想知道我是否可以更改日期格式以将.SSS视为可选项?

谢谢你的帮助

Sul*_*han 20

据我所知,没有办法制作可选参数.

通常的解决方案是使用两个格式化程序,每种格式一个.要决定使用哪种格式化程序,您可以

  1. 计算日期字符串中的字符数(如使用NSDateFormatter解析RFC 822日期中所建议的那样)

  2. 只需尝试两种格式化程序并获得第一个非nil结果.

由于您的日期格式类似,您只能使用一个格式化程序,如果日期字符串太短,请.000在使用格式化程序之前附加.