首页 > 解决方案 > iOS Swift 如何让 DateFormatter 在任何地区都没有年份?

问题描述

我想从两个日期创建一个日期字符串,格式如下:

"Apr 21 - Sep 17, 2018" - US
"21 Apr - 17 Sep, 2018" - Elsewhere

同时尊重本地日期格式(美国的 MMM dd,欧洲的 dd MMM 等)。

如何让 DateFormatter 给我默认样式但没有年份?

let startDateFormatter = DateFormatter()
// How to keep medium style but without year?
// this is the US style, 
// I want locale-independent style to match the other date formatter
startDateFormatter.dateFormat = "MMM dd" 

let endDateFormatter = DateFormatter()
endDateFormatter.dateStyle = .medium
endDateFormatter.timeStyle = .none

let startDateText = startDateFormatter.string(from: startDate)
let endDateText   = endDateFormatter.string(from: endDate)

标签: iosswiftdatensdateformatterdateformatter

解决方案


使用DateIntervalFormatter. 这旨在为您提供一个正确本地化的字符串,表示两个日期之间的日期间隔。

这是您的两个日期的示例:

// Test code for the two dates
let firstDate = Calendar.current.date(from: DateComponents(year: 2018, month: 4, day: 21))!
let lastDate = Calendar.current.date(from: DateComponents(year: 2018, month: 9, day: 17))!

let dif = DateIntervalFormatter()
dif.timeStyle = .none
dif.dateStyle = .medium
let dateInt = dif.string(from: firstDate, to: lastDate)

结果(美国):

2018 年 4 月 21 日 – 9 月 17 日

结果(英国):

2018 年 4 月 21 日至 9 月 17 日


如果您确实需要使用正确本地化DateFormatter的特定dateFormat内容(例如月份和日期,但没有年份),请使用setLocalizedDateFormatFromTemplate.

let df = DateFormatter()
df.setLocalizedDateFormatFromTemplate("MMMdd")
let result = df.string(from: Date())

这将给出仅包含日期和缩写月份的正确本地化结果。


推荐阅读