iOS - NSDateFormatter dateFromString 仅在一种情况下返回 nil

标签 ios swift nsdate nsdateformatter

我正在测试日期格式 ("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() 也会发生同样的情况:

Using Swift version 3

编辑 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/

相关文章:

ios - Firebase 通知不在前台,但在 iOS Ionic 2 应用程序中为后台工作

ios - 从不同于 Cell Click 的 UICollectionViewCell 按钮执行 Segue

ios - 如何在不更改文本的 alpha 的情况下更改 TableViewCell 的 alpha?

objective-c - NSDateFormatter : Time displayed with backslashes 问题

objective-c - 设置 NSDateComponents 会导致不正确的 NSDate

ios - 如果 UITextField 和 UITextView 在 Swift 中为空,则禁用 UIButton

ios - 轻量级迁移复制属性内容

ios - 在 iOS 中以更高音调播放音乐的最简单方法?

swift - 类型 'StorageMetadata' 的值没有成员 'downloadURL'

iOS NSDate() 返回错误的时间