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



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

10:45 - 12:00 AM

我可以使用DateInvervalFormatter:非常接近这一点

let cal = Calendar.current
let formatter = DateIntervalFormatter()
formatter.dateStyle = .none
formatter.timeStyle = .short
let start = Date()
let end = cal.date(byAdding: .hour, value: 1, to: start)
formatter.string(from: DateInterval(start: start, end: end!))

以上(在en_US区域设置中(将产生如下输出:

5:27 – 6:27 PM

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

let formatter = DateIntervalFormatter()
formatter.dateStyle = .none
formatter.timeStyle = .short
let startComponents = DateComponents(year: 2020, month: 1, day: 1, hour: 23, minute: 45)
let start = cal.date(from: startComponents)
let end = cal.date(byAdding: .hour, value: 1, to: start!)
formatter.string(from: DateInterval(start: start!, end: end!))

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

1/1/2020, 11:45 PM – 1/2/2020, 12:45 AM

我想要的是:

11:45 PM – 12:45 AM

我怎么能拿到这个?我知道我可以使用DateFormatter将每个日期(开始和结束(格式化为一个时间,然后将两个字符串加上中间的连字符(-(,但这不一定是本地化友好的。

我最终得到的是:

extension Date {

func formatTimeInterval(
to: Date,
timeZone: TimeZone = .autoupdatingCurrent
) -> String {

let formatter = DateIntervalFormatter()
formatter.timeZone = timeZone
formatter.timeStyle = .short
formatter.dateStyle = .none

// we need to manually strip any "date" metadata, because for some locales,
// even if we set `formatter.dateStyle = .none`, if the dates are in two different days
// we will still get the date information in the end result (e.g. for the US locale)

let calendar = Calendar.current
let fromComponents = calendar.dateComponents([.hour, .minute, .second], from: self)
let toComponents = calendar.dateComponents([.hour, .minute, .second], from: to)
let fromDate = calendar.date(from: fromComponents)!
let toDate = calendar.date(from: toComponents)!
return formatter.string(from: fromDate, to: toDate)
}
}

然而,如果间隔日期在不同的月份(比如8月31日至9月1日(,它会添加一个从第1年开始的日期,类似

1/1/1, 11:45 PM – 1/2/1, 12:45 AM

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

最新更新