【问题标题】:Wrong date sent to web service发送到 Web 服务的错​​误日期
【发布时间】:2017-06-06 05:33:45
【问题描述】:

我正在使用 Alamofire 4.0 和 Swift 3.0
我应该在我的网络服务中使用时区发布当前日期和时间。
当我尝试在控制台中打印时,我得到了正确的当前时间,但是当使用 Alamofire 将该数据推送到 Web 服务时,日期和时间会更改/增加 8 小时。
这是我正在尝试的代码。请帮助我,让我了解何时以及为什么会出错。

let now = NSDate();
        let formatter = DateFormatter();
        formatter.dateFormat = "yyyy-MM-dd HH:mm:ss zzz";
        let defaultTimeZoneStr = formatter.string(from: now as Date);
        print(defaultTimeZoneStr)


        Alamofire.request("http:********", method: .post, parameters:  ["id": 1, "date" : defaultTimeZoneStr, "value": "null", "publisher": "Jack", "title": "Time Warner, "url": "internet/6/"], encoding: JSONEncoding.default).responseString
        {
                response in
                print("Success: \(response.result.isSuccess)")
                print("Response String: \(response.result.value)")
        }

所以在控制台中,defaultTimeZoneStr 将是我当前的时间。但是在网络服务中,会迟到 8 个小时。
请帮忙。
谢谢。

【问题讨论】:

  • 您应该检查 (1) 时区是否包含在 timeString 中,并且 (2) 也在服务器端解析, (3) 将正确的数据放入数据库中 (4) 从数据库中正确读取时区 (5) 打印您当地时区的时间
  • 你使用"zzz" -> "GMT+1" 但也有"Z" 用于"+0100" 也许这在服务器端解析得更好。
  • 为了获得好的答案,您需要包括服务器端代码和一些数据库代码

标签: swift swift3 nsstring nsdate nsdateformatter


【解决方案1】:

zzz 返回缩写的时区显示名称。

你应该知道:

  1. 时区显示名称不是唯一的。比如常用的PST可以同时代表太平洋标准时间(UTC-08)和菲律宾标准时间(UTC+08)。

  2. 不同语言的时区显示名称可能不同。您没有为格式化程序设置区域设置,因此名称可以是随机的。

简而言之,如果您需要标准格式,请不要使用zzz,例如用于 API 调用。使用Z 或X 变体之一。

【讨论】:

  • 我删除了 zzz 并保留了“yyyy-MM-dd HH:mm:ss”。网络服务中仍然发布了错误的时间。
【解决方案2】:

这与您的模拟器或手机时区有关。它始终适用于 UTC。

在我看来,您总是使用 UTC 0。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多