【发布时间】:2023-04-09 06:16:02
【问题描述】:
更新
从 iOS 7 开始,NSDateFormatter 确实在以这种格式呈现字符串时确实会创建一个 NSDate:
NSDateFormatter *formatter = [NSDateFormatter new];
[formatter setDateFormat:@"@"yyyy'-'MM'-'dd'T'HH':'mm':'ssZ""];
NSLog(@"non–nil date, even honoring the 7–minute–offset in the time–zone on iOS 7: %@",
[formatter dateFromString:@"2011-07-12T18:07:31+02:07"]);
对于 iOS 6,答案是不使用 NSDateFormatter……
好的,至此我已经阅读完毕
- Docs 和
- Technotes 在 Apple,
- the Unicode reference的重要部分和
- 这里有很多问题和答案
关于如何使用NSDateFormatter 从字符串中创建NSDate。
我也偶然发现了 Peter Hosey 的 ISO8601DateFormatter。
看着他的实现,我想知道:
难道没有一种既正确又理智的方法可以将这样的字符串2011-07-12T18:07:31+02:00 转换为NSDate?
- 如果最后一个冒号不存在也没关系。
- 如果在“+”号前加上
GMT是没有问题的,但是... - 事实并非如此。
我可以破解它为我的应用程序工作(使用格式@"yyyy'-'MM'-'dd'T'HH':'mm':'ssz':'00")但那是 - 当然 - 不正确因为它会丢弃分钟信息时区。
我也可以用空字符串替换最后一个冒号,但我也认为这是一种黑客攻击。
那么,有什么秘诀可以让NSDateFormatter 从上面获取那个字符串并给我一个有效且正确的NSDate?
旁白:
我在某个地方找到了提示,可以使用+[NSDate dateWithNaturalLanguageString:] 来实现我的目标。这——然而——只设置日期,而不是时间! (嗯,它确实设置了时间,但只考虑了时区偏移,而不是 HH:mm:ss 部分......)
【问题讨论】:
-
您是否找到了适用于 ISO8601 偏移的实际解决方案(不是 hack)?
-
@delirus 不幸的是,不是 :-(
-
感谢您的回复 :) 我发现 Peter Hosey 的
ISO8601DateFormatter值得考虑,但据报道它非常慢(请参阅 stackoverflow.com/questions/2201216/…)
标签: nsdateformatter iso8601 timezone-offset