iOS UIDatePicker的日期和现在早8小时的日期
iOS UIDatePicker's date and now date early 8 hours
还有我的代码,我处理了时区,现在datepicker的时间是正确的,但是datepicker显示的时间还是不对,用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()
的结果:
+++++++++++++DatePicker: 2018-05-25 02:44:33 +0000++++++++++++++Date: 2018-05-25 10:44:00 +0000++++++++++++++Now: 2018-05-24 00:44:38
+0000+++++++++++++
我在datepicker中选择的时间是2018-05-2510:44。现在的时间应该是2018-05-248:44:38。不过和节目中的时间还有差距
添加与 GMT 时间间隔偏移的代码是错误的。不要那样做。
您遇到的问题是默认情况下日期以 GMT (UTC) 显示。您可以使用 DateFormatter class 方法 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)+++++++++++++")
我为日期创建了一个简单的扩展 class,这使得这更容易做到:
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()
(但请注意,当用户更改日期时,您确实应该将日期保存到实例变量中,而不是从日期选择器中获取它。在视图对象中保存模型数据是一种代码味道。)
还有我的代码,我处理了时区,现在datepicker的时间是正确的,但是datepicker显示的时间还是不对,用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()
的结果:
+++++++++++++DatePicker: 2018-05-25 02:44:33 +0000++++++++++++++Date: 2018-05-25 10:44:00 +0000++++++++++++++Now: 2018-05-24 00:44:38 +0000+++++++++++++
我在datepicker中选择的时间是2018-05-2510:44。现在的时间应该是2018-05-248:44:38。不过和节目中的时间还有差距
添加与 GMT 时间间隔偏移的代码是错误的。不要那样做。
您遇到的问题是默认情况下日期以 GMT (UTC) 显示。您可以使用 DateFormatter class 方法 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)+++++++++++++")
我为日期创建了一个简单的扩展 class,这使得这更容易做到:
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()
(但请注意,当用户更改日期时,您确实应该将日期保存到实例变量中,而不是从日期选择器中获取它。在视图对象中保存模型数据是一种代码味道。)