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 AMDate() @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:00yyyy-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 aHH:mm 是没有意义的。 12/24h 格式可以从系统设置中自动替换。

以上是关于Swift日期格式化程序忽略月份的主要内容,如果未能解决你的问题,请参考以下文章

SQL里怎么把日期截取为月份

Swift 日期格式化程序错误地转换/创建日期/字符串 [重复]

SwiftDate 浅析

iOS Swift:当字符串包含时区缩写时,如何将特定的日期字符串格式转换为日期对象?

如何在 Swift 中制作日期格式化程序以仅显示日期的年份部分?

接受不同类型日期格式的掩码格式化程序