了解 Swift 中的日期和时区。 DatePicker 提供了 UTC 格式,对于不同时区的所有用户来说,这是否可以正确显示?

问题描述 投票:0回答:1

我需要一些帮助来了解日期和时区在 Swift / SwiftUI 中的工作原理。

我当前正在使用 DatePicker 组件并选择范围从现在到无穷大。 DatePicker 返回 UTC 格式的日期,并将该日期保存到我的数据库中。当另一个时区的用户查看此日期时,它会自动转换到正确的时区吗?

我的日期本质上是一个倒计时,因此每个用户的倒计时应该是相同的,无论他们的时区如何。我不知道我是否需要进行更多转换,或者 iOS 是否正在为我做这件事。

这是我正在使用的示例代码:

import SwiftUI

struct ContentView: View {
    
    @State private var timeNow = Date.now.addingTimeInterval(3600)
    
    var body: some View {
        VStack {
            Text("Countdown ends in:")
            
            Text(timeNow, style: .timer)
                .font(.largeTitle)
                .monospaced()
            
            DatePicker("Opens", selection: $timeNow, in: Date.now...)
                .labelsHidden()
            
        }
        .padding()
        .onAppear {
            UIDatePicker.appearance().minuteInterval = 15
        }
    }
}

#Preview {
    ContentView()
}
swift date swiftui
1个回答
0
投票

Date
不与任何时区关联。它仅代表时间上的“瞬间”,即自某个预定义纪元以来的 n 秒。 假设数据库没有对

Date

值执行任何奇怪的操作(即,如果列的类型也表示

instant
),那么当所有用户从数据库中获取同一行时,他们将看到相同的倒计时。由于这是倒计时,因此无需以任何方式转换 Date。需要做的就是找到现在和
Date
之间的秒数差异,并将其格式化为持续时间。时区在这里无关紧要。
另一方面,不同时区的用户显然会看到在日期选择器中为相同的 

timeNow

值选择了不同的时间。

DatePicker
需要显示年、月、日、时、分等。要获得这些数字,它需要解释某个时区的
Date
。默认情况下,这是用户的时区,但您可以通过更改环境来覆盖它。
.environment(\.timeZone, someTimeZone)

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.