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

Ios Swift日期格式化程序忽略月份,ios,swift,nsdate,nsdateformatter,nsdatecomponents,Ios,Swift,Nsdate,Nsdateformatter,Nsdatecomponents,我写了一个日期重新格式化,但Swift的日期格式化程序本身似乎忽略了月份。文件上说这不应该发生。我如何使它不被忽视 let testDate:String = "2020-11-22-11:00" print("start date: ",testDate," reformatted date: ", reformatDate(dateString: testDate))

我写了一个日期重新格式化,但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
表示月日,而
dd
表示年日

请注意,您还应执行以下操作:

dateFormatter.locale = Locale(identifier: "en_US_POSIX")
无论何时使用自定义日期格式

yyyy-MM-DD HH:MM
解析
2020-11-22-11:00
意味着您想要2020年的第二十二天,即11月。这毫无意义,
DateFormatter
最终忽略了月份,因为一年中的某一天显然是一个“更强”的日期组件。任何一年的第22天都是1月22日

然后,当您使用
DD-MM-yyyy h:MM a
格式化解析的日期时,月份组件将显示为
01
,而一年中的日期仍显示为22

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


您的格式字符串不正确。应该是:

yyyy-MM-dd-HH:mm

dd
表示月日,而
dd
表示年日

请注意,您还应执行以下操作:

dateFormatter.locale = Locale(identifier: "en_US_POSIX")
无论何时使用自定义日期格式

yyyy-MM-DD HH:MM
解析
2020-11-22-11:00
意味着您想要2020年的第二十二天,即11月。这毫无意义,
DateFormatter
最终忽略了月份,因为一年中的某一天显然是一个“更强”的日期组件。任何一年的第22天都是1月22日

然后,当您使用
DD-MM-yyyy h:MM a
格式化解析的日期时,月份组件将显示为
01
,而一年中的日期仍显示为22

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


为什么这会影响OPs输出中的月值?当我尝试时,
DD-MM-yyyy h:MM a的日期格式输出
Date=132-05-2021 9:27 AM
用于
Date()
@duncac我觉得有必要解释一下,所以我发布了一个答案。我现在明白了。OP在字符串到日期输入格式化程序和日期到字符串输出格式化程序中都使用了
DD
。这为什么会影响OPs输出中的月份值?当我尝试时,
DD-MM-yyyy h:MM a的日期格式输出
Date=132-05-2021 9:27 AM
用于
Date()
@duncac我觉得有必要解释一下,所以我发布了一个答案。我现在明白了。OP在字符串到日期的输入格式化程序和日期到字符串的输出格式化程序中都使用了
DD
。我还想补充一点,如果不将区域设置设置为
en_US\u POSIX
,尝试解析
h:mm a
HH:mm
是毫无意义的。12/24小时格式可以从系统设置中自动替换。@Sulthan感谢您提醒我!:)我还要补充一点,如果不将区域设置设置为
en_US_POSIX
,那么尝试解析
h:mm a
HH:mm
是毫无意义的。12/24小时格式可以从系统设置中自动替换。@Sulthan感谢您提醒我!:)