[英]NSDateFormatter dateFromString Always Returns nil
我想提前为问一个重复的问题道歉,但其他解决方案都没有对我有用。 每次我尝试将日期字符串传递给 dateFromString 函数时,我都会得到零。 我没有读到任何自 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
感谢您的帮助!
这里有两个问题:
格式化程序期望的日期字符串格式 ( @"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];
另一种获得 nil 的方法是,如果您使用hh
并且您的工作时间是 24 小时制并且大于 12,那么在这种情况下,您需要HH
(或H
,用于零填充)。
即:
为此向@neilco(见他的回答下方的评论)致谢。 如果你喜欢这个答案,也请给他点赞。
使用固定格式日期(例如 RFC 3339)时,您可以设置 dateFormat 属性以指定格式字符串。
如果您的日期格式为2017-06-16T17:18:59.082083Z
则dateFormat
属性应如下所示yyyy-MM-dd'T'HH:mm:ss.SSSSSSZ
。
斯威夫特 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
您的日期格式与您传递的字符串不匹配,您的 dateString 应该按照您的 [dateFormat setDateFormat:@"yyyy-MM-dd hh:mm:ss"] 使用此格式;
2013-10-09 02:40:29
nil 表示 dateFormat 对象无法解析您的字符串。
如果有人和我一样被困在同一个热闹的边缘案例中:
只要您在遵循夏令时的语言环境中,“2020-03-08T02:00:00”就会返回nil
,因为那个小时被跳过并且根本不存在。
您正在尝试使用 dateFromString,但您传递给格式化程序的格式与您在 dateString 中使用的格式不同。
尝试在您的 dateFormat 中使用此配置: E',' M d',' yyyy 'at' hh:mm:ss aa z
不要忘记转义"yyyy/MM/dd' 'HH:mm:ss"
空格符号
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.