【问题标题】:Convert time string into date swift将时间字符串快速转换为日期
【发布时间】:2017-02-19 21:40:07
【问题描述】:

我使用 firebase 作为后端并存储一串时间,例如下午 7:00。

我正在尝试转换从 Firebase 接收的字符串并将其转换为 NSDate,以便我可以对其进行排序,更改时间..etc

到目前为止,我已经在网上查看并想出了这段代码

dateFormatter.dateFormat = "hh:mm a"
                  dateFormatter.locale = NSLocale.current
                  dateFormatter.timeZone = NSTimeZone.local
                  let date = dateFormatter.date(from: item)
                  self.times.append(date!)
                  print("Start: \(date)")

其中 item 是字符串 (7:00 PM)

当我运行应用程序时,控制台返回:

项目:上午 9:00

开始:可选(2000-01-01 05:00:00 +0000)

我已经设置了时区、语言环境、格式。为什么返回的时间不正确?

打印出其他一些示例:

项目:下午 1:20

开始:可选(2000-01-01 17:20:00 +0000)

项目:上午 9:40

开始:可选(2000-01-01 05:40:00 +0000)

项目:上午 10:00

开始:可选(2000-01-01 05:00:00 +0000)

项目:下午 12:00

开始:可选(2000-01-01 17:00:00 +0000)

【问题讨论】:

  • 首先,上午/下午 12 小时的格式是“hh”,而不是“HH”
  • 这实际上是一个错误,我确实有它作为 hh:mm a (编辑帖子)
  • 你的时区是什么?
  • 我猜你和 GMT+0 相差 5 小时?对?这解释了小时问题。对于年/月/日,这是因为您的字符串不包含任何有关它的信息,因此将其作为参考 2000。
  • 是的,我是。那我该如何解决呢?无论如何都要让它在上午 9:00 显示?

标签: swift nsdate


【解决方案1】:

永远记住这一点:Date / NSDate 以 UTC 存储时间。如果您的时区不是 UTC,print(date) 返回的值将始终不同。

您可以通过指定 UTC 时区来打印存储在 Firebase 中的小时。默认为用户(即您的)时区:

let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "hh:mm a"
dateFormatter.timeZone = TimeZone(secondsFromGMT: 0)

let item = "7:00 PM"
let date = dateFormatter.date(from: item)
print("Start: \(date)") // Start: Optional(2000-01-01 19:00:00 +0000)

【讨论】:

  • 是否可以使用当前日期代替 2000-01-01?
  • 这是个坏主意。 “当前日期”每天都在变化。你不关心日期部分,所以最好选择一个固定的日期
  • 这正是我的项目所需要的。我已经想通了 - 我必须设置 'defaultDate' 才能让它工作。
猜你喜欢
  • 1970-01-01
  • 2018-05-24
  • 2015-09-17
  • 1970-01-01
  • 1970-01-01
  • 2022-08-18
  • 2017-08-31
相关资源
最近更新 更多