Swift日期格式化程序忽略月份
Posted
技术标签:
【中文标题】Swift日期格式化程序忽略月份【英文标题】:Swift date formatter ignoring months 【发布时间】:2021-08-02 20:42:30 【问题描述】:我写了一个日期格式化程序,但似乎 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!
【问题讨论】:
为什么会影响 OPs 输出中的月份值?当我尝试时,DD-MM-yyyy h:mm a
的 dateFormat 输出 Date = 132-05-2021 9:27 AM
为 Date()
@DuncanC 我觉得有必要解释一下,所以我发布了一个答案。
我现在明白了。 OP 在 string-to-Date 输入格式化程序和 date-to-String 输出格式化程序中都使用了 DD
。
【参考方案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 年的第22 天,即11 月。这没有任何意义,DateFormatter
最终忽略了月份,因为显然一年中的某天是一个“更强”的日期组成部分。每年的第 22 天是 1 月 22 日。
然后,当您使用DD-MM-yyyy h:mm a
格式化解析的日期时,月份组件将显示为01
,而年份仍显示为22。
这里有一些有用的链接可帮助您了解格式说明符,您将了解小写/大写的重要性。
NSDateFormatter.com TR-35【讨论】:
我还要补充一点,如果不将语言环境设置为en_US_POSIX
,尝试解析 h:mm a
或 HH:mm
是没有意义的。 12/24h 格式可以从系统设置中自动替换。以上是关于Swift日期格式化程序忽略月份的主要内容,如果未能解决你的问题,请参考以下文章
Swift 日期格式化程序错误地转换/创建日期/字符串 [重复]
iOS Swift:当字符串包含时区缩写时,如何将特定的日期字符串格式转换为日期对象?