我正在测试日期格式 ("dd-MM-yyyy"
) 的一些值,有一个特殊情况我无法解释:
var datef = NSDateFormatter()
datef.dateFormat = "dd-MM-yyyy";
var date_a = "02-01-1990"
var date_b = "01-01-1990"
var date_f_a = datef.dateFromString(date_a);
var date_f_b = datef.dateFromString(date_b);
data_f_a
返回 Jan 2, 1990, 12:00 AM,但 date_f_b
返回 nil。除 1990 年 1 月 1 日外,任何其他日期都将返回预期值。
如果我添加 datef.lenient = true
date_f_b 不再是 nil,但我不需要这样做。为什么它是无效日期?
编辑 1:
如果我使用 DateFormatter()
也会发生同样的情况:
编辑 2: Xcode 版本:8.1
最佳答案
经过一些评论,确定问题中的代码正在使用 es_PE
的语言环境运行。这是秘鲁的国家。有问题的日期是 1990 年 1 月 1 日。默认情况下,NSDateFormatter
使用本地时区,并且在解析没有时间的日期字符串时,假设为午夜。
在秘鲁,在 1990 年,夏令时从 1990 年 1 月 1 日午夜开始。这意味着时钟从 1989 年 12 月 31 日晚上 11:59:59 直接转到 1990 年 1 月 1 日 1:00: 00 点。 1990 年 1 月 1 日没有午夜。
这就是此用户尝试转换字符串 01-01-1990
失败的原因。秘鲁的这个日期没有午夜(可能还有一些其他地方,如果有的话,同时开始夏令时)。大多数测试此代码的人会声称它工作得很好,因为大多数测试此代码的人不住在秘鲁。
我发现了一个有用的网站,其中包含有用的信息。参见 http://www.timeanddate.com/time/change/peru/lima?year=1990有关秘鲁和夏令时的详细信息。请注意,在 1989 年和 1991 年,秘鲁没有使用夏令时。
关于iOS - NSDateFormatter dateFromString 仅在一种情况下返回 nil,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41009530/