忽略月份的 Swift 日期格式化程序

问题描述

我写了一个日期重新格式化程序,但似乎 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。

这里有一些有用的链接来了解格式说明符,您将了解小写/大写的重要性。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...