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:我添加了一个例子。