【发布时间】:2021-03-29 20:40:58
【问题描述】:
我希望使用 Swift 5 创建一个 Date 对象,其中包含我传递的日期、月份和年份。问题是 DateFormatter 有自己的想法,并且似乎将我的 Date 对象视为 UTC,即使我将 <formatter>.timeZone = ... 设置为。
假设我想要日期对象为 4 月 1 日。
private func firstOfApril() -> String {
let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd"
return "\(formatter.date(from: "2021-04-01")!)"
}
如果我在这里的上午 (GMT + 13) 执行此操作,我会收到 2021-03-31 11:00:00 +0000。我期待:2021-04-01 00:00:00
我尝试了什么:
enum TZType{
case None
case Current
case Auto
case Nil
case Default
}
private func firstOfApril(none_current:TZType) -> String {
let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd"
switch none_current {
case .None:
formatter.timeZone = .none
case .Current:
formatter.timeZone = .current
case .Nil:
formatter.timeZone = nil
case .Auto:
formatter.timeZone = .autoupdatingCurrent
case .Default:
break
}
return "\(formatter.date(from: "2021-04-01")!)"
}
print(firstOfApril(none_current: .None))
print(firstOfApril(none_current: .Current))
print(firstOfApril(none_current: .Auto))
print(firstOfApril(none_current: .Nil))
print(firstOfApril(none_current: .Default))
输出
2021-03-31 11:00:00 +0000
2021-03-31 11:00:00 +0000
2021-03-31 11:00:00 +0000
2021-03-31 11:00:00 +0000
我的应用程序中没有时区的概念。我认为应该有,但我被否决了。所有时间都是“本地时间”,如挂钟时间,而不是本地时区。
【问题讨论】:
-
问题是在将日期转换为字符串时也需要使用日期格式化程序。当您打印(或使用字符串插值)您的日期时,它将始终打印 UTC 时区 (+0000)
-
private func firstOfApril() -> String { let formatter = DateFormatter() formatter.dateFormat = "yyyy-MM-dd" let date = formatter.date(from: "2021-04-01")! return formatter.string(from: date) }// "2021-04-01"