【问题标题】:Converting date string to Date issue in Swift 3在 Swift 3 中将日期字符串转换为日期问题
【发布时间】:2017-09-16 15:12:16
【问题描述】:

我看到很多线程将日期字符串转换为日期,但对我没有任何帮助。以下是我正在尝试做的事情。

我有一个 UIDatePicker,我正在尝试获取选定的日期和时间。我得到了正确的日期,但时间不正确。问题在于时区。下面给出我使用的代码。

let abbreviation = TimeZone.current.abbreviation() //Without this also same issue happens

let dateFormatter = DateFormatter()
dateFormatter.locale = NSLocale.current
dateFormatter.timeZone = NSTimeZone.init(abbreviation: abbreviation!) as TimeZone!
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"

let selectedDateStr = dateFormatter.string(from: self.timePicker.date) //Prints: "2017-04-20 07:50:40"

let selectedDateFromStr = dateFormatter.date(from: selectedDateStr)! as Date as NSDate //Prints: "2017-04-20 02:20:40 +0000"

如何在没有时区问题的情况下获得正确的时间?

这是实际情况 - 已更新:

我想让用户设置闹钟时间。我有两个视图,一个是从时间选择器中选择时间,另一个是显示闹钟时间列表。

如果我从选择器中选择一个时间并将其显示在警报列表中,它将始终显示当前时间。使用上面给出的代码。 但是,如果我终止应用并重新打开,它会显示正确的时间!

这里发生了什么?

【问题讨论】:

  • 日期正确。 printing a Date 的输出始终是 UTC。顺便说一句:不要在 Swift 3 中使用带有 NS 前缀的 Foundation 类。使用本机结构(LocaleTimeZoneDate
  • 我明白了。但是我怎样才能得到正确的时间呢?
  • 日期格式化程序为您提供正确的时间。如果您将selectedDateFromStr 转换回Date,它将与self.timePicker.date 相同。 Date 是一个时刻 (Double),它与 ​​UTC 参考日期不同。它不包含时区或区域信息。使用 raw Date 对象进行日期数学运算,并将格式化程序用于人类可读的表示。
  • 使用 Swift 2.x 版本,它运行良好。我只取 datepicker 值,它是有效的。仅更新到 Swift 3 后,问题就开始了。实际上,我想将 datepicker 值分配给警报“时间”。现在它显示错误的时间。我该如何解决这个问题?
  • 您的日期是正确的。顺便说一句,不需要弄乱时区。 DateFormatter 默认时区是当前时区。您可以使用相同的 dateFormatter 验证生成的日期以再次获取字符串。 dateFormatter.string(from: selectedDateFromStr)

标签: swift3 nsdate nsdateformatter uidatepicker xcode8


【解决方案1】:

试试这个

        var dateFormatters = DateFormatter()
        dateFormatters.locale = Locale.current
        dateFormatters.timeZone = TimeZone.current
        dateFormatters.dateFormat = "yyyy-MM-dd HH:mm:ss"
        let selectedDateStr = dateFormatters.string(from: self.timePicker.date)
        let selectedDateFromStr = dateFormatters.date(from: selectedDateStr)!

您正在将 dateformatter 时区转换为字符串。

【讨论】:

  • 仍然没有变化。这就是我得到的。 2017-04-20 04:50:35 +0000 - timeIntervalSinceReferenceDate : 514356635.0
  • 更新了我的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-20
  • 2017-03-15
  • 1970-01-01
  • 2016-08-20
  • 1970-01-01
  • 1970-01-01
  • 2011-11-28
相关资源
最近更新 更多