【问题标题】:Date() returns hour over 24Date() 返回超过 24 小时
【发布时间】:2018-05-12 08:51:11
【问题描述】:

我必须通过我的应用程序将日期从我的 iPhone 发送到服务器,但我很惊讶日期在服务器中存储为 NULL(并不总是),这就是用于此的代码:

timeS = (Date().millisecondsSince1970)
// make some assertions on timeS
let date = Date(timeIntervalSince1970: timeS)
let dateFormatter = DateFormatter()
dateFormatter.timeZone = TimeZone(abbreviation: "UTC")
dateFormatter.locale = NSLocale.current
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
let dateString = dateFormatter.string(from: date)
return dateString

似乎服务器端的c#代码试图将字符串转换为日期,但失败了,所以它被存储为NULL。

所以最近我尝试在字符串中不做任何修改地发送日期以查看发生了什么:

self.backS.sendLocation(msg: "data fitched \(Date())")

这就是我在数据库中找到的:

数据于 2018 年 5 月 8 日 77:45:44 AM +0000

一定是:

数据于 2018-05-08 07:45:44 AM +0000(因为那是服务器的时间)

不知道为什么会这样!!

非常感谢任何人的帮助,在此先感谢。

【问题讨论】:

    标签: ios swift date


    【解决方案1】:

    尝试在 Swift 中像这样获取您当前的日期和时间。

    let date = Date()
    let formatter = DateFormatter()
    formatter.dateFormat = "yyyy-MM-dd HH:mm:ss Z"
    let result = formatter.string(from: date)
    self.backS.sendLocation(msg: "data fetched \(result)")
    

    您的结果将是这样的。

    "2018-05-12 14:34:51 +0000"
    

    【讨论】:

    • 这就是我为日期列所做的,直到我在“msg”字段中输入没有任何格式或任何内容的日期之前,我不知道为什么它收到 null。
    • 我尝试了你的解决方案,结果是这样的:“2018-05-12 14:02:20 +0300”我想要它“+0000”而不是“+0300”,我编辑了我的问题更清楚,谢谢。
    【解决方案2】:

    要将日期发送到服务器,您应该使用 Unix 时间戳,而不是字符串格式的日期。

    但是,如果你坚持使用字符串,你应该使用DateFormatter。使用DateFormatter 时,您应该始终设置格式化程序的locale 属性。这样可以确保格式生成器返回一致的结果,无论您手机的区域设置如何。

    let formatter = DateFormatter()
    formatter.locale = Locale(identifier: "en_US_POSIX")
    formatter.dateFormat = "yyyy-MM-dd HH:mm:ss Z"
    let dateString = formatter.string(from: Date())
    

    在设置dateFormat 属性之前设置locale 属性很重要。

    如果您未设置 locale 属性,则在设置了 12 小时格式的设备上使用 24 格式时,格式化程序可能会返回 nil,反之亦然。

    来源:Technical Q&A QA1480

    【讨论】:

    • 你能解释一下为什么有人应该使用 Unix 时间戳吗?
    • 另外,既然你引用QA1480,你也应该在格式化程序上设置时区。
    • @Sulthan Unix 时间戳独立于时区,因此它们是分布式客户端-服务器应用程序的不错选择。至于时区,应该使用设备区域设置中设置的一个(因此不设置此属性)。设置 locale 属性是必要的,因为在设置了 12 小时格式的设备上使用 24 小时格式可能会导致接收 nil 作为 string(for:) 方法的返回值 - 根据 op 对@Rizwan Ahmed 的回答。
    • 很棒的发现@mag_zbc
    • 它自己的日期没有返回为NULL,但在转换失败后它存储为NULL。我编辑了我的问题以便更清楚,谢谢。
    猜你喜欢
    • 2015-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多