iOS UIDatePicker的日期和现在日期提前8小时



有我的代码,我已经处理了时区,现在日期选择器上显示的时间是正确的,但是日期选择器上显示的时间仍然是错误的,使用Date()获得的当前时间也是错误的。

@IBAction func dateChanged(_ datePicker: UIDatePicker) {
let timeZone = NSTimeZone.system
let interval = timeZone.secondsFromGMT(for: datePicker.date)
let dateComponents = Calendar.current.dateComponents([.year, .month, .day, .hour, .minute, .timeZone], from: datePicker.date.addingTimeInterval(TimeInterval(interval)))
remindDate = Calendar.current.date(from: dateComponents)!
print("+++++++++++++DatePicker: (datePicker.date)++++++++++++++Date: (remindDate)++++++++++++++Now: (Date())+++++++++++++")
updateDateDetial(remindDate)
}

这是print()的结果:

+++++++++++++日期选择器: 2018-05-25 02:44:33 +0000++++++++++++++++++++日期: 2018-05-25 10:44:00

+0000++++++++++++++++现在: 2018-05-24 00:44:38 +0000+++++++++++++

我从日期选择器中选择的时间是 2018-05-25 10:44。现在的时间应该是2018-05-24 8:44:38。但是,与计划中的时间仍然存在差距。

从 GMT 添加时间间隔偏移量的代码是错误的。别这样。

您面临的问题是默认情况下日期以 GMT (UTC( 显示。可以使用 DateFormatter 类方法 localizedDate 在当前区域设置中为您提供日期字符串。

let datePickerDateString = DateFormatter.localizedString(from: datePicker.date,
dateStyle: .medium,
timeStyle, .medium)
let remindDateString = DateFormatter.localizedString(from: remindDate,
dateStyle: .medium,
timeStyle, .medium)
let nowString = DateFormatter.localizedString(from: Date(),
dateStyle: .medium,
timeStyle, .medium)
print("+++++++++++++DatePicker: (datePickerDateString)++++++++++++++Date: (remindDateString)++++++++++++++Now: (nowString)+++++++++++++")

我为 Date 类创建了一个简单的扩展,使此操作变得更加容易:

extension Date {
func localString(dateStyle: DateFormatter.Style = .medium, timeStyle: DateFormatter.Style = .medium) -> String {
return DateFormatter.localizedString(from: self, dateStyle: dateStyle, timeStyle: timeStyle)
}
}

这会将您的代码折叠为:

print("+++++++++++++DatePicker: (datePicker.date.localString())" + 
"++++++++++++++Date: (remindDate.localString())" + 
"++++++++++++++Now: (Date().localString())+++++++++++++")

编辑

如果要将日期选取器的日期安装到标签中,则代码可能如下所示(使用上面的Date扩展(

myLabel.text = datePicker.date.localString()

(但请注意,当用户更改日期时,您应该真正将日期保存到实例变量中,而不是从日期选择器中获取它。在视图对象中保存模型数据是一种代码异味。

最新更新