DateFormatter.localizedString在某些date被打破

这是我在select器更改时所做的:

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) 

这就是它看起来如何的date:

在这里输入图像说明 在这里输入图像说明 在这里输入图像说明 在这里输入图像说明

假设。 11月6日之前的date一切正常,11月6日之后一切都closures了。 为什么?

更新:

对于我使用的每个时区来说,这个关键date是不同的。 例如:

华沙(+0200)的date是10月30日芝加哥(-0500)的date是11月6日

订购的印刷品:

 -----
 2017-11-04 00:00:00 +0000
 2017年11月4日
 America / New_York(current)
 1509753600.0
 -----
 2017-11-05 00:00:00 +0000
 2017年11月5日
 America / New_York(current)
 1509840000.0
 -----
 2017-11-06 00:00:00 +0000
 2017年11月5日
 America / New_York(current)
 1509926400.0
 -----
 2017-11-07 00:00:00 +0000
 2017年11月6日
 America / New_York(current)
 1510012800.0

在你的function

 extension Date { var fromCurrentToUTC: Date { return addingTimeInterval(-TimeInterval(TimeZone.current.secondsFromGMT())) } } 

将减去当前date的GMT偏移量,而不是由要调整的date的GMT偏移量。 因此,如果要调整的date处于DST期间且当前date不是,则反之亦然。

这可以通过使用来解决

 extension Date { var fromCurrentToUTC: Date { return addingTimeInterval(-TimeInterval(TimeZone.current.secondsFromGMT(for: self))) } } 

代替。 但是,更好的解决scheme是将date格式化程序的时区设置为UTC,而不是调整date:

 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) }