这是我在选择器更改时所做的:
extension Date {
var fromCurrentToUTC: Date {
return addingTimeInterval(-TimeInterval(TimeZone.current.secondsFromGMT()))
}
}
var title = "--"
if let date = datePickerView.date?.fromCurrentToUTC {
title = DateFormatter.localizedString(from: date, dateStyle: .medium, timeStyle: .none)
}
print("-----")
print(datePickerView.date!)
print(title)
print(TimeZone.current)
print(datePickerView.date!.timeIntervalSince1970)
dateTimeSegmentControl.setTitle(title, forSegmentAt: 0)
这是它查找日期的方式:
假设。 11 月 6 日之前的日期一切都很好,11 月 6 日之后一切都关闭了。为什么?
更新:
我使用的每个时区的关键日期都不同。例如:
华沙 (+0200) 日期是 10 月 30 日 芝加哥 (-0500) 日期是 11 月 6 日
有序打印:
----- 2017-11-04 00:00:00 +0000 4 Nov 2017 America/New_York (current) 1509753600.0 ----- 2017-11-05 00:00:00 +0000 5 Nov 2017 America/New_York (current) 1509840000.0 ----- 2017-11-06 00:00:00 +0000 5 Nov 2017 America/New_York (current) 1509926400.0 ----- 2017-11-07 00:00:00 +0000 6 Nov 2017 America/New_York (current) 1510012800.0
最佳答案
在你的函数中
extension Date {
var fromCurrentToUTC: Date {
return addingTimeInterval(-TimeInterval(TimeZone.current.secondsFromGMT()))
}
}
减去当前日期的 GMT 偏移量,而不是 根据要调整的日期的 GMT 偏移量。因此你得到 如果要调整的日期在夏令时期间而当前日期不在夏令时期间,则结果错误,反之亦然。
这可以通过使用来修复
extension Date {
var fromCurrentToUTC: Date {
return addingTimeInterval(-TimeInterval(TimeZone.current.secondsFromGMT(for: self)))
}
}
相反。但是,更好的解决方案是设置时区 将日期格式化程序转换为 UTC,而不是调整日期:
if let date = datePickerView.date {
let fmt = DateFormatter()
fmt.dateStyle = .medium
fmt.timeStyle = .none
fmt.timeZone = TimeZone(secondsFromGMT: 0)
let title = fmt.string(from: date)
print(title)
}
关于ios - 某些日期的 DateFormatter.localizedString 已损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46320207/