问题描述
我写了一个日期重新格式化程序,但似乎 Swift 的日期格式化程序本身忽略了月份。文档说这不应该发生。我如何让它不忽略几个月?
let testDate:String = "2020-11-22-11:00"
print("start date: ",testDate," reformatted date: ",reformatDate(dateString: testDate))
func reformatDate(dateString: String) -> String? {
print("dateString: ",dateString)
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-DD-HH:mm"
dateFormatter.timeZone = TimeZone(abbreviation: "UTC")
return dateFormatter.string(from: dateString)
}
这个打印:
start date: 2020-11-22-11:00 converted date: 22-01-2020 11:00 AM
它不合理地将所有月份变为 1!
解决方法
您的格式字符串不正确。应该是:
yyyy-MM-dd-HH:mm
和
dd-MM-yyyy h:mm a
dd
表示月份中的某天,而 DD
表示一年中的某天。
请注意,您还应该这样做:
dateFormatter.locale = Locale(identifier: "en_US_POSIX")
每当您使用自定义日期格式时。
使用 2020-11-22-11:00
解析 yyyy-MM-DD-HH:mm
意味着您想要 2020 年的第 20 天,即 11 月。这是没有意义的,DateFormatter
最终忽略了月份,因为显然年中的日期是“更强”的日期组件。任何一年的第 22 天都是 1 月 22 日。
然后,当您使用 DD-MM-yyyy h:mm a
格式化解析的日期时,月份组件将显示为 01
,而年中的日期仍显示为 22。
这里有一些有用的链接来了解格式说明符,您将了解小写/大写的重要性。