2017-04-20 111 views
0

转换日期字符串到日期的问题,我见过很多线程日期字符串转换为日期,但没有为我工作。以下是我想要做的。斯威夫特3

我有一个的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" 

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

下面是实际的场景 - 更新:

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

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

这里发生了什么?

+1

日期是否正确。 '打印'日期'的输出始终是UTC。顺便说一句:不要使用基础类与'NS'前缀斯威夫特3.使用原生结构('Locale','TimeZone','Date') – vadian

+0

我知道了。但我如何获得正确的时间? – Mithun

+1

日期格式化程序会为您提供正确的时间。如果将'selectedDateFromStr'转换回'Date',它将与'self.timePicker.date'相同。 “日期”是一个时间(“双”),它是与UTC参考日期的差异。它不包含时区或区域设置信息。与* raw *'Date'对象进行数据计算,并使用格式化程序进行人类可读的表示。 – vadian

回答

0

试试这个

 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时区字符串。

+0

仍然没有变化。这就是我得到的。 2017年4月20日4时50分35秒+0000 - timeIntervalSinceReferenceDate:514356635.0 – Mithun

+0

更新了我的问题。 – Mithun