【问题标题】:How to get current date from current timezone from a time server in Swift?如何从 Swift 中的时间服务器获取当前时区的当前日期?
【发布时间】:2020-07-28 06:12:28
【问题描述】:

我正在开发我想根据用户当前时区获取当前日期的应用程序。即使用户从他们的设备设置菜单中更改了日期。

获取我使用的当前时区

let timeZone = TimeZone.current
print(timeZone)

例如,在这里我得到了“亚洲/加尔各答”,当前日期是 7 月 28 日,现在如果用户将日期(设置-> 日期和时间-> 自动关闭)更改为 7 月 29 日,我会得到类似“亚洲”的输出/加尔各答的日期是 7 月 29 日,但实际日期是 7 月 28 日。那么我怎样才能获得这个(亚洲/加尔各答)时区的当前日期。

注意:我想使用它,因为如果用户尝试从设置更改日期,然后我需要从该时区获取确切日期,我需要特定时区的当前日期。

【问题讨论】:

  • 您现在收到的答案对您不起作用,因此这清楚地表明您需要改进并澄清您的问题
  • @JoakimDanielson 好的,非常感谢,我对我的问题进行了更详细的修改。

标签: ios swift swift4 swift4.2


【解决方案1】:

如果您需要确保日期是有效日期,您可以使用时间服务器根据设备 IP 返回日期,当然这需要互联网连接。

您可以创建一个异步方法来返回当前日期,而不考虑用户时区及其时区:


struct Root: Codable {
    let unixtime: Date
    let timezone: String
}

extension URL {
    static let timeIP = URL(string: "http://worldtimeapi.org/api/ip")!
    static func asyncTime(completion: @escaping ((Date?, TimeZone?, Error?)-> Void)) {
        URLSession.shared.dataTask(with: .timeIP) { data, response, error in
            guard let data = data else {
                completion(nil, nil, error)
                return
            }
            do {
                let decoder = JSONDecoder()
                decoder.dateDecodingStrategy = .secondsSince1970
                let root = try decoder.decode(Root.self, from: data)
                completion(root.unixtime, TimeZone(identifier: root.timezone), nil)
            } catch {
                completion(nil, nil, error)
            }
        }.resume()
    }
}

用法:

URL.asyncTime { date, timezone, error in
    guard let date = date, let timezone = timezone else {
        print("Error:", error ?? "")
        return
    }
    print("Date:", date.description(with: .current))  // "Date: Tuesday, July 28, 2020 at 4:27:36 AM Brasilia Standard Time\n"
    print("Timezone:", timezone)   // "Timezone: America/Sao_Paulo (current)\n"
}

【讨论】:

    【解决方案2】:

    这是一个简单的解决方案:

    let timezone = TimeZone.current
    let seconds = TimeInterval(timezone.secondsFromGMT(for: Date()))
    let date = Date(timeInterval: seconds, since: Date())
    print(date)
    

    您也可以简单地使用Date(),但在使用它来显示它时使用DateFormatter。这是一个例子:

    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
    let formattedDate = dateFormatter.string(from: Date())
    print(formattedDate)
    

    【讨论】:

    • 如果用户从设置中更改日期,那么在此代码根据时区给出正确结果之后?
    • 是的,将处理更改设备时区。
    • 听起来不错。让我试试这个
    • 不,这不起作用。当我从 28 日(今天到 29 日)进行更改时。它会更新
    • 您究竟是如何更新时区的?
    【解决方案3】:

    如果你想要用户的当前日期,你可以简单地实现let date = Date()。它将返回用户设备上使用的日期。

    这个例子会显示给我

    let date = Date() // Jul 28, 2020 at 8:22 AM
    var timezone = TimeZone.current // Europe/Berlin (current)
    

    【讨论】:

    • 您没有正确阅读我的问题。在这种情况下,如果用户更改日期表单设置,那么我们会得到错误的输出
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-03
    • 1970-01-01
    • 2023-01-30
    • 1970-01-01
    • 2020-07-24
    • 1970-01-01
    • 2010-11-21
    相关资源
    最近更新 更多