Ios 某些日期的DateFormatter.localizedString已中断

Ios 某些日期的DateFormatter.localizedString已中断,ios,swift,nsdateformatter,Ios,Swift,Nsdateformatter,当选择器更改时,我会这样做: extension Date { var fromCurrentToUTC: Date { return addingTimeInterval(-TimeInterval(TimeZone.current.secondsFromGMT())) } } var title = "--" if let date = datePickerView.date?.fromCurrentToUTC { title = Dat

当选择器更改时,我会这样做:

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 ----- 2017-11-04 00:00:00 +0000 2017年11月4日 美国/纽约(当前) 1509753600 ----- 2017-11-05 00:00:00 +0000 2017年11月5日 美国/纽约(当前) 1509840000 ----- 2017-11-06 00:00:00 +0000 2017年11月5日 美国/纽约(当前) 1509926400 ----- 2017-11-07 00:00:00 +0000 2017年11月6日 美国/纽约(当前) 1510012800 在你的职责范围内

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()))
    }
} 
将减去当前日期的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)
}

最可能的原因是夏时制的结束(华沙的夏时制是2017年11月5日,芝加哥的夏时制是2017年10月29日)。什么?;)我该如何解决这个问题呢?它在芬兰(10月29日)似乎运行良好-在DateFormatter中看不到任何错误的日期。LocalizedStringDateFormatter代码乍一看是正确的,因此
date
一定是错误的。显示打印(日期、标题)和打印(时区.current)的输出(有问题的日期…)。。。。和
打印(日期.时间间隔自1970年起)
最有可能是由于夏时制结束(华沙的夏时制为2017年11月5日,芝加哥的夏时制为2017年10月29日)。什么?;)我该如何解决这个问题呢?它在芬兰(10月29日)似乎运行良好-在DateFormatter中看不到任何错误的日期。LocalizedStringDateFormatter代码乍一看是正确的,因此
date
一定是错误的。显示打印(日期、标题)和打印(时区.current)的输出(有问题的日期…)。。。。和
打印(日期.时间间隔自1970年起)
那么它应该工作吗?现在我对新的xcode有问题,但请检查它soon@Bartłomiejsemanńczyk:它在我的测试中起作用,但你应该自己验证。@Bartłomiejsemanńczyk:注意,更好的解决方案是使用自定义日期格式化程序,时区设置为UTC,不是调整日期。但是自定义日期格式化程序将阻止我使用本地格式的日期。。。一旦是2017年7月27日或2017年7月27日@Bartłomiejsemanńczyk:我已经添加了一个例子。那么它会起作用吗?现在我对新的xcode有问题,但请检查它soon@Bartłomiejsemanńczyk:它在我的测试中起作用,但你应该自己验证。@Bartłomiejsemanńczyk:注意,更好的解决方案是使用自定义日期格式化程序,时区设置为UTC,不是调整日期。但是自定义日期格式化程序将阻止我使用本地格式的日期。。。一旦是2017年7月27日或2017年7月27日@Bartłomiejsemanńczyk:我添加了一个例子。