我想提前道歉,问一个重复的问题,但其他解决方案都没有对我有用。每次我尝试将日期字符串传递给dateFromString函数时,我都会得到nil。自从iOS 7更新以来,我没有看到任何事情发生了变化,但是如果这对于是否仍然以相同的方式起作用有所不同,我现在正在进行更新。
这是我用来从字符串创建日期的代码:
NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setTimeZone:[NSTimeZone systemTimeZone]];
[dateFormat setLocale:[NSLocale systemLocale]];
[dateFormat setDateFormat:@"yyyy-MM-dd hh:mm:ss"];
[dateFormat setFormatterBehavior:NSDateFormatterBehaviorDefault];
NSDate *date = [[NSDate alloc] init];
date = [dateFormat dateFromString:dateString];
return date;
我已根据我为解决此问题而阅读的所有解决方案设置了dateFormat,但这些设置都没有解决问题。 systemLocale绝对是为英语设置的,因此不会引起任何问题。
这是我传递给dateFromString的dateString:
Wednesday, October 9, 2013 at 2:40:29 PM Pacific Daylight Time
感谢您的帮助!
答案 0 :(得分:40)
这里有两个问题:
格式化程序期望的日期字符串格式(@"yyyy-MM-dd hh:mm:ss"
)与您尝试解析的日期字符串格式(@"EEEE, MMMM d, yyyy 'at' h:mm:ss a zzzz"
)不同。
将格式化程序的区域设置设置为[NSLocale systemLocale]
,导致[dateFormat dateFromString:]
返回nil
。将其设置为[NSLocate currentLocale]
。
格式化程序的完整代码应为:
NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setTimeZone:[NSTimeZone systemTimeZone]];
[dateFormat setLocale:[NSLocale currentLocale]];
[dateFormat setDateFormat:@"EEEE, MMMM d, yyyy 'at' h:mm:ss a zzzz"];
[dateFormat setFormatterBehavior:NSDateFormatterBehaviorDefault];
NSDate *date = [dateFormat dateFromString:dateString];
答案 1 :(得分:23)
另一种获得nil的方法是,如果你使用hh
并且你的小时数是24小时制,那么> 12,在这种情况下,您需要HH
(或H
,用于零填充。)
那是:
给@neilco的帽子提示(请参阅下面他的回答评论)。如果你喜欢这个答案,请向他投票。
答案 2 :(得分:2)
您的日期格式与您传递的字符串不匹配,您的dateString应该按照您的[dateFormat setDateFormat:@" yyyy-MM-dd hh:mm: SS"];
2013-10-09 02:40:29
nil表示dateFormat对象无法解析您的字符串。
答案 3 :(得分:2)
根据NSDateFormatter documentation:
使用固定格式的日期(例如RFC 3339)时,可以设置 日期格式 用于指定格式字符串的属性。
如果您的日期格式为2017-06-16T17:18:59.082083Z
,则dateFormat
属性应如下yyyy-MM-dd'T'HH:mm:ss.SSSSSSZ
。
Swift 3
let dateFormatter = DateFormatter()
let date = "2017-06-16T17:18:59.082083Z"
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSSSSZ"
let result = dateFormatter.date(from: date) // 2017-06-16 17:18:59 +0000
答案 4 :(得分:1)
万一有人被困在与我同一个搞笑的边缘情况下:
只要您位于夏令时之后的语言环境中,“ 2020-03-08T02:00:00”将返回nil
,因为该时间已跳过并且根本不存在。
答案 5 :(得分:0)
您正在尝试使用dateFromString,但您传递给Formatter的格式与您在dateString中使用的格式不同。
尝试在dateFormat中使用此配置:E',' M d',' yyyy 'at' hh:mm:ss aa z
答案 6 :(得分:0)
别忘了转义"yyyy/MM/dd' 'HH:mm:ss"
空格符号