iOS 日期格式不带年份,且本地化正确

pap*_*ay0 6 date nsdateformatter ios swift dateformatter

Jun 28你知道我如何在 iOS 上获得以下日期字符串吗?

\n
    \n
  • Jun 28用英语
  • \n
  • 28 juin法语
  • \n
  • ETC
  • \n
\n

我想要基本上short month, day, without year。(按照本地化顺序,例如day, month法语)

\n

我尝试了以下方法:

\n
let dateFormatter = DateFormatter()\ndateFormatter.dateFormat = "MMM dd"\nlet dateStr = dateFormatter.string(from: Date())\nprint(dateStr) // --> Jun 28\n
Run Code Online (Sandbox Code Playgroud)\n

它适用于英语,但不适用于其他语言。

\n

例如,如果您设置
\n dateFormatter.locale = Locale(identifier: "fr\xe2\x80\x9d)
\n它应该输出28 juin,但它返回juin 28

\n

我也尝试使用:

\n
let date = Date()\nlet customFormat = "MMM dd"\nlet frLocale = Locale(identifier: "fr_FR")\nlet frFormat = DateFormatter.dateFormat(fromTemplate: customFormat, options: 0, locale: frLocale)\nlet formatter = DateFormatter()\nformatter.dateFormat = frFormat\nlet dateStr = formatter.string(from: date)\nprint(dateStr) // -> 28 Jun\n
Run Code Online (Sandbox Code Playgroud)\n

^__ 顺序正确,但月份是英文的。

\n

最接近的是:

\n
let dateFormatter = DateFormatter()\ndateFormatter.timeStyle = .none\ndateFormatter.dateStyle = .medium\nlet dateStr = dateFormatter.string(from: Date())\nprint(dateStr) // --> Jun 28, 2020\n
Run Code Online (Sandbox Code Playgroud)\n

^__ 但我不想要年份。

\n

All*_*ian 4

我相信文档的这一部分是关键(我的意思是,如果我只是在格式化程序上重新设置区域设置而不再次设置模板,我会得到您在第一种情况下描述的内容):

func setLocalizedDateFormatFromTemplate(String)

重要提示:您应该仅在设置接收器的区域设置后调用此方法。

果然,当你这样做时,你会得到正确的格式:

let dateFormatter = DateFormatter()
dateFormatter.locale = Locale(identifier: "en_US")
dateFormatter.setLocalizedDateFormatFromTemplate("MMM dd")
print(dateFormatter.string(from: Date())) // --> Jun 28

dateFormatter.locale = Locale(identifier: "fr_FR")
dateFormatter.setLocalizedDateFormatFromTemplate("MMM dd")
print(dateFormatter.string(from: Date())) // --> 28 juin
Run Code Online (Sandbox Code Playgroud)

顺便说一句,WWDC'20 中有一个关于格式化程序的非常好的会议