DateFormatter.localizedString 某些日期已损坏
DateFormatter.localizedString is broken for some of the dates
这是我在选择器更改时所做的:
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 偏移量。因此你得到
如果要调整的日期在 DST 期间而当前日期不在 DST 期间,则结果错误,反之亦然。
这可以通过使用
来解决
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)
}
这是我在选择器更改时所做的:
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 偏移量。因此你得到 如果要调整的日期在 DST 期间而当前日期不在 DST 期间,则结果错误,反之亦然。
这可以通过使用
来解决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)
}