iOS 没有年份的日期格式,正确的本地化

iOS Date Formatting without year, with correct localization

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

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

我尝试了以下方法:

let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "MMM dd"
let dateStr = dateFormatter.string(from: Date())
print(dateStr) // --> Jun 28

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

例如,如果您设置
dateFormatter.locale = Locale(identifier: "fr”)
它应该输出 28 juin 但它 returns juin 28.

我也试过用:

let date = Date()
let customFormat = "MMM dd"
let frLocale = Locale(identifier: "fr_FR")
let frFormat = DateFormatter.dateFormat(fromTemplate: customFormat, options: 0, locale: frLocale)
let formatter = DateFormatter()
formatter.dateFormat = frFormat
let dateStr = formatter.string(from: date)
print(dateStr) // -> 28 Jun

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

最接近的是:

let dateFormatter = DateFormatter()
dateFormatter.timeStyle = .none
dateFormatter.dateStyle = .medium
let dateStr = dateFormatter.string(from: Date())
print(dateStr) // --> Jun 28, 2020

^__ 但我不想要年份。

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

func setLocalizedDateFormatFromTemplate(String)

Important: You should call this method only after setting the locale of the receiver.

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

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

对了,还有a really good session about formatters in WWDC'20