在 SwiftUI 中实时更新相对时间

Live update relative time in SwiftUI

在我的 SwiftUI 应用程序中,我按如下方式显示相对时间。

struct ContentView: View {

    let date: Double = 1589014112

    var body: some View {
        Text(Date(timeIntervalSince1970: date).relativeTime())
    }
}

extension Date {
    func relativeTime(in locale: Locale = .current) -> String {
        let formatter = RelativeDateTimeFormatter()
        formatter.unitsStyle = .full
        return formatter.localizedString(for: self, relativeTo: Date())
    }
}

我从 API 中得到自 1970 年以来的时间间隔的两倍。我想在我的应用程序中显示相对时间。输出如下。

视图仅在我重新加载时更新,并且每过一秒都停留在“10 秒前”。如何实时更新?我想在当前日期 (Date()) 更改时更改。

您可以使用 TimerPublisher 定期触发某些内容。
下面是一个简单的例子;

struct PlaygroundView: View {

    let timer = Timer.publish(
        every: 1, // second
        on: .main,
        in: .common
    ).autoconnect()

    let date = Date()

    @State var secondStr: String = ""

    var body: some View {
        Text(secondStr)
            .onReceive(timer) { (_) in
                self.secondStr = self.date.relativeTime()
            }
    }
}

extension Date {
    func relativeTime(in locale: Locale = .current) -> String {
        let formatter = RelativeDateTimeFormatter()
        formatter.unitsStyle = .full
        return formatter.localizedString(for: self, relativeTo: Date())
    }
}

你可以观察到 secondStr 每秒都在变化,就像
1 秒前
2 秒前
等等..

您可以使用 SwiftUI Text 的 init(_:style:) 在没有计时器的情况下完成此操作。

let date: Double = 1589014112

var body: some View {
    Text(Date(timeIntervalSince1970: date), style: .relative)
}

注意:可用的 style 对于大多数用例来说应该足够了,但它们有些受限。参见 Text.DateStyle