Swift 用字符表示两个时间差的 Date extension

6 min read
import Foundation

extension Date {
    func fromNow() -> String {
        // ask for the full relative date
        let formatter = RelativeDateTimeFormatter()
        formatter.unitsStyle = .full
        formatter.locale = Locale(identifier: Locale.preferredLanguages.first!)
        
        // get exampleDate relative to the current date
        let relativeDate = formatter.localizedString(for: self, relativeTo: Date.now)
        
        return relativeDate
    }
}

这个 Date extension 用于计算两个时间之间的差,并返回一个字符串表示这个差值。这里使用了 Swift 的日期和时间处理库 Foundation 中的 RelativeDateTimeFormatter 类。

具体来说,这个 extension 中的 fromNow 函数会先创建一个 RelativeDateTimeFormatter 对象,并设置其 unitsStyle 属性为 .full,即输出完整的时间差。然后通过 formatter.localizedString(for: self, relativeTo: Date.now) 方法获取当前时间和该时间之间的差值,并返回一个字符串表示该差值。最后,以相对时间的格式返回该字符串。

使用这个 extension 很简单,只需要在任何一个 Date 实例上调用 fromNow 函数即可,例如:

let date = Date(timeIntervalSinceNow: -86400) // 1 day ago
print(date.fromNow()) // 输出:Yesterday

这里的 date 实例表示一天前的时间,调用 fromNow 函数后会返回 "Yesterday"。