使用NSDateFormatter的字符串中的日期,无论12h-24h设置如何

时间:2010-05-04 09:44:14

标签: iphone time nsstring format nsdateformatter

今天我的问题是关于日期格式和字符串。 我的应用程序下载一些代表互联网日期的字符串。日期格式总是如下:“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对象)?

3 个答案:

答案 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)