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