今天我的问题是关于日期格式和字符串。 我的应用程序下载一些代表互联网日期的字符串。日期格式总是如下:“2010-05-24 at 20:45” 我需要将此字符串转换为NSDate对象,以便执行某些日期操作。 我试过这段代码:
NSString * dateString = @"2010-05-24 at 20:45" // actually downloaded from the internet
NSDateFormatter * myDateFormatter = [[NSDateFormatter alloc] init];
[myDateFormatter setDateFormat:@"yyyy-MM-dd 'at' HH:mm"];
NSDate * dateFromString = [myDateFormatter dateFromString:dateString];
只要iPhone设置为24小时,这似乎完全正常。只要我在常规设置中切换到12h时钟,就不会创建NSDate对象(并且应用程序很快崩溃) 我读过其他有类似问题的人,但我似乎找不到解决办法。 现在的问题是: 我认为NSDateFormatter对用户设置是明智的,只要我指定它应该用于解析字符串的格式(由于它来自Web而不可修改),有什么用途检查用户设置? 更重要的是,如何执行任务(无论用户设置如何,都从字符串中获取NSDate对象)?
答案 0 :(得分:5)
This解释了这个问题背后的原因以及解决方法。
答案 1 :(得分:4)
NSString * dateString = @"2010-05-24 at 20:45" // actually downloaded from the internet
NSDateFormatter * myDateFormatter = [[NSDateFormatter alloc] init];
[myDateFormatter setDateFormat:@"yyyy-MM-dd 'at' hh:mm"];
NSDate * dateFromString = [myDateFormatter dateFromString:dateString];
在设置日期格式时使用“hh”而不是“HH”
答案 2 :(得分:1)
我发现Apple的这篇文章正好解释了这个问题! (https://developer.apple.com/library/content/qa/qa1480/_index.html)
但无论如何,简短的答案是您需要将语言环境设置为“en_US_POSIX”,以便它可以与任何用户设置日期相关的配置一起使用。
let stringDate = "2017-03-15T11:37:16-03:00" // ISO8601 formatted string
let iso8601Formatter = DateFormatter()
iso8601Formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZZZZZ"
iso8601Formatter.locale = Locale(identifier: "en_US_POSIX")
iso8601Formatter.date(from: stringDate)