我需要一些帮助来了解日期和时区在 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()
}
Date
不与任何时区关联。它仅代表时间上的“瞬间”,即自某个预定义纪元以来的 n 秒。
假设数据库没有对 Date
值执行任何奇怪的操作(即,如果列的类型也表示
instant),那么当所有用户从数据库中获取同一行时,他们将看到相同的倒计时。由于这是倒计时,因此无需以任何方式转换
Date
。需要做的就是找到现在和 Date
之间的秒数差异,并将其格式化为持续时间。时区在这里无关紧要。另一方面,不同时区的用户显然会看到在日期选择器中为相同的 timeNow
值选择了不同的时间。
DatePicker
需要显示年、月、日、时、分等。要获得这些数字,它需要解释某个时区的 Date
。默认情况下,这是用户的时区,但您可以通过更改环境来覆盖它。.environment(\.timeZone, someTimeZone)