首页 > 解决方案 > 如何忽略 Swift Dates 中的时区?

问题描述

我希望使用 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

我的应用程序中没有时区的概念。我认为应该有,但我被否决了。所有时间都是“本地时间”,如挂钟时间,而不是本地时区。

标签: swiftdatetimetimezone

解决方案


里奥明白了。

该函数的最后几行应该是:

    let retDate = formatter.date(from: "2021-04-01")!
    return formatter.string(from: retDate)

总共:

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
    }
    let retDate = formatter.date(from: "2021-04-01")!
    return formatter.string(from: retDate)
}

推荐阅读