DateFormatter 不转换特定日期 (Swift)

Posted

技术标签:

【中文标题】DateFormatter 不转换特定日期 (Swift)【英文标题】:DateFormatter does NOT convert specific dates (Swift) 【发布时间】:2021-09-16 21:27:10 【问题描述】:

我在操场和应用程序上有以下代码,而 DateFormatter 仅针对日期“1990-10-21”返回 nil:


let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "YYYY-MM-dd"

let date1 = dateFormatter.date(from: "1990-10-20") // "Oct 20, 1990 at 12:00 AM"
let date2 = dateFormatter.date(from: "1990-10-21") // nil
let date3 = dateFormatter.date(from: "1990-10-22") // "Oct 22, 1990 at 12:00 AM"

在 1989 年、2021 年进行测试...运行良好...

有没有人知道这是为什么?是bug吗?

【问题讨论】:

【参考方案1】:

您的代码存在三个问题。第一个YYYYYearForWeekOfYear。你需要的是yyyy。其次,你没有打发时间。请注意,并非所有日期都从 12:00am(夏令时转换日期)开始。您可以通过设置日历或将有效时间(下午 12 点)与日期一起传递来防止日期格式化程序返回 nil。第三,在使用固定日期格式时,您应该始终将语言环境设置为 "en_US_POSIX"


let dateFormatter = DateFormatter()
dateFormatter.calendar = .current
dateFormatter.locale = .init(identifier: "en_US_POSIX")
dateFormatter.dateFormat = "yyyy-MM-dd"

let date1 = dateFormatter.date(from: "1990-10-20") // "Oct 20, 1990 at 12:00 AM"
let date2 = dateFormatter.date(from: "1990-10-21") // "Oct 21, 1990 at 1:00 AM"
let date3 = dateFormatter.date(from: "1990-10-22") // "Oct 22, 1990 at 12:00 AM"

【讨论】:

我在我的代码上使用了语言环境,只是在此处和操场上删除了,因为它不会影响问题。我尝试了yyyy,但它也没有影响问题,但我明白你的意思,我会继续使用yyyy。设置日历是我从未尝试解决的问题。谢谢 YYYY 在接近新年的日期会给你错误的结果

以上是关于DateFormatter 不转换特定日期 (Swift)的主要内容,如果未能解决你的问题,请参考以下文章

当我在英国地区将字符串转换为日期并且时区是马斯喀特时,DateFormatter 给了我不正确的结果

在 DateFormatter 扩展中包含日期转换器功能

字符串到日期的转换有时会使用 DateFormatter 返回 nil

Swift DateFormatter 不会根据预设的 Dateformat 转换日期

Swift DateFormatter 错误地转换字符串日期/时间

Dateformatter 返回零日期