Swift Foundation RelativeDateTimeFormatter 的使用详解和代码演示

23 min read

RelativeDateTimeFormatter 是一个用于将日期/时间格式化成相对时间的类。它可以将日期/时间格式化成更友好的形式,比如“1小时前”、“昨天”、“上周”等等。这个类在 Swift Foundation 中已经可以使用了。

首先,我们需要导入 Foundation 框架,然后创建一个 RelativeDateTimeFormatter 对象。

import Foundation

let formatter = RelativeDateTimeFormatter()

接下来,我们可以将日期/时间转换为相对时间。比如,我们可以使用 formatter.localizedString(for: date) 方法将日期转换为本地化的相对时间字符串。

let date = Date(timeIntervalSinceNow: -3600)

let string = formatter.localizedString(for: date, relativeTo: Date())
print(string) // 输出:"1 hour ago"

在上面的例子中,我们将当前时间往前推了1个小时,然后使用了 “1 hour ago” 这个相对时间字符串。

我们还可以指定 formatter.unitsStyle 属性来控制相对时间字符串的精度。具体来说,相对时间字符串可以使用以下 3 种不同的样式:

  • 方案1:automatically。这是默认设定,在需要时自动选择最精确的格式。
  • 方案2:numeric。使用数字和单位作为相对时间字符串,例如 “1 day ago” 或 “2 hours ago”。
  • 方案3:named。使用更友好的相对时间字符串,例如 “yesterday” 或 “last week”。
formatter.unitsStyle = .numeric
let numericString = formatter.localizedString(for: date, relativeTo: Date())
print(numericString) // 输出:"1 hour ago"

formatter.unitsStyle = .named
let namedString = formatter.localizedString(for: date, relativeTo: Date())
print(namedString) // 输出:“yesterday”

最后,我们还可以将 formatter.dateTimeStyle 属性设置为 .named,以便根据当前时间的不同,格式化日期/时间的不同表现形式。比如,我们可以将当前时间往前推2天,然后根据不同的时间格式化出不同的表现形式。

let date2 = Date(timeIntervalSinceNow: -2 * 24 * 3600)

formatter.dateTimeStyle = .named
formatter.unitsStyle = .full
print(formatter.localizedString(for: date2, relativeTo: Date())) // 输出:“Saturday, February 27, 2021”
formatter.unitsStyle = .short
print(formatter.localizedString(for: date2, relativeTo: Date())) // 输出:“2 days ago”
formatter.unitsStyle = .spellOut
print(formatter.localizedString(for: date2, relativeTo: Date())) // 输出:“two days ago”

在上面的例子中,我们将 formatter.dateTimeStyle 设置为 .named。然后,根据不同的 formatter.unitsStyle 设置,可以格式化出不同的表现形式。如果 unitsStyle 是 .full,那么输出的将是日期的全名,比如 “Saturday, February 27, 2021”;如果 unitsStyle 是 .short,那么输出的将是一个精确的相对日期,比如 “2 days ago”;如果 unitsStyle 是 .spellOut,那么输出的将是一个拼写出来的相对日期,比如 “two days ago”。

这就是 RelativeDateTimeFormatter 类的简单介绍和使用方法。如果你需要更精确的时间格式化,可以使用 DateFormatter 类。如果你想要实现更复杂的日期/时间计算,可以使用 DateComponents 类。