Swift DateIntervalFormatter:即使间隔跨越多天,也将日期保留在字符串之外

kcs*_*cks 6 date-formatting swift

我正在尝试格式化时间间隔。我想要一个看起来像这样的结果:

\n\n
10:45 - 12:00 AM\n
Run Code Online (Sandbox Code Playgroud)\n\n

我可以使用以下方法非常接近这一点DateInvervalFormatter

\n\n
let cal = Calendar.current\nlet formatter = DateIntervalFormatter()\nformatter.dateStyle = .none\nformatter.timeStyle = .short\nlet start = Date()\nlet end = cal.date(byAdding: .hour, value: 1, to: start)\nformatter.string(from: DateInterval(start: start, end: end!))\n
Run Code Online (Sandbox Code Playgroud)\n\n

上面的内容(在 en_US 语言环境中)将产生如下输出:

\n\n
5:27\xe2\x80\x89\xe2\x80\x93\xe2\x80\x896:27 PM\n
Run Code Online (Sandbox Code Playgroud)\n\n

看起来不错吧?但是,如果间隔中的两个日期位于不同日期,则此方法不起作用。例如:

\n\n
let formatter = DateIntervalFormatter()\nformatter.dateStyle = .none\nformatter.timeStyle = .short\nlet startComponents = DateComponents(year: 2020, month: 1, day: 1, hour: 23, minute: 45)\nlet start = cal.date(from: startComponents)\nlet end = cal.date(byAdding: .hour, value: 1, to: start!)\nformatter.string(from: DateInterval(start: start!, end: end!))\n
Run Code Online (Sandbox Code Playgroud)\n\n

尽管设置dateStyle.none,上例中生成的字符串(在 en_US 语言环境中)为:

\n\n
1/1/2020, 11:45 PM\xe2\x80\x89\xe2\x80\x93\xe2\x80\x891/2/2020, 12:45 AM\n
Run Code Online (Sandbox Code Playgroud)\n\n

我想要的是:

\n\n
11:45 PM\xe2\x80\x89\xe2\x80\x93\xe2\x80\x8912:45 AM\n
Run Code Online (Sandbox Code Playgroud)\n\n

我怎样才能得到这个?我知道我可以使用 aDateFormatter将每个日期(开始和结束)格式化为一个时间,然后将两个字符串与-中间的连字符 ( ) 一起附加,但这不一定适合本地化。

\n

Ale*_*toc 1

我最终得到的是:

\n
extension Date {\n    \n    func formatTimeInterval(\n        to: Date,\n        timeZone: TimeZone = .autoupdatingCurrent\n    ) -> String {\n        \n        let formatter = DateIntervalFormatter()\n        formatter.timeZone = timeZone\n        formatter.timeStyle = .short\n        formatter.dateStyle = .none\n        \n        // we need to manually strip any "date" metadata, because for some locales,\n        // even if we set `formatter.dateStyle = .none`, if the dates are in two different days\n        // we will still get the date information in the end result (e.g. for the US locale)\n        \n        let calendar = Calendar.current\n        let fromComponents = calendar.dateComponents([.hour, .minute, .second], from: self)\n        let toComponents = calendar.dateComponents([.hour, .minute, .second], from: to)\n        let fromDate = calendar.date(from: fromComponents)!\n        let toDate = calendar.date(from: toComponents)!\n        return formatter.string(from: fromDate, to: toDate)\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

但是,如果间隔日期位于不同月份(例如 8 月 31 日 - 9 月 1 日),它会添加从第 1 年开始的日期,例如

\n

1/1/1, 11:45 PM\xe2\x80\x89\xe2\x80\x93\xe2\x80\x891/2/1, 12:45 AM

\n

仍然没有干净的解决方案......

\n