ios - 当夏令时结束时,在 Date 对象中添加/减少日期会返回错误的日期
问题描述
我在用着
Calendar.current.date(byAdding: .day, value: -1, to: somedate) ?? somedate
从某个日期减少 1 天。由于夏令时于 2020 年 11 月 1 日结束。当我尝试在 2020 年 11 月 2 日 0hr:0m:0s 的日期对象执行此操作时,我希望它返回 2020 年 11 月 1 日 0hr:0m:0s,但是相反,它返回 2020 年 10 月 31 日 23hr:0m:0s。
是我做错了什么还是其他问题?
如何重现:-
- 使用时间戳 1604275200 创建一个日期对象。使用
Date(timeIntervalSince1970: 1604275200)
- 将您设备的时区更改为考虑夏令时的某个地方。我在
HST
时区试过 - 尝试使用上述方法减少一天。
- 您会看到日期返回为 10 月 31 日。
extension Date {
init(timeIntervalInMillis: Double) {
self.init(timeIntervalSince1970: timeIntervalInMillis / 1000)
}
func add(_ component: Calendar.Component, value: Int) -> Date {
return Calendar.current.date(byAdding: .day, value: value, to: self) ?? self
}
var noon: Date {
return Calendar.current.date(bySettingHour: 12, minute: 0, second: 0, of: self)!
}
}
print(Calendar.current.timeZone.identifier)
let date = Date(timeIntervalInMillis: 1604275200000)
print("Date is ",date)
print("Yesterday's date is ",date.add(.day, value: -1))
print("Noon time is ",date.noon)
print("Yesterday date from noon's date is ",date.noon.add(.day, value: -1))
输出:
America/Chicago
Date is 2020-11-02 00:00:00 +0000
Yesterday's date is 2020-10-31 23:00:00 +0000
Noon time is 2020-11-01 18:00:00 +0000
Yesterday date from noon's date is 2020-10-31 17:00:00 +0000
任何帮助,将不胜感激。
解决方案
编辑/更新:
您的代码没有任何问题。您的问题是您正在打印 UTC 日期表示,而不是使用时区设置为芝加哥的 DateFormatter 来显示所需时区的结果日期。
print("Date is ",date) // Date is 2020-11-02 00:00:00 +0000\n"
print("Yesterday's date is ",date.add(.day, value: -1)) // "Yesterday's date is 2020-10-31 23:00:00 +0000\n"
print("Noon time is ",date.noon) // "Noon time is 2020-11-01 18:00:00 +0000\n"
print("Yesterday date from noon's date is ",date.noon.add(.day, value: -1)) // "Yesterday date from noon's date is 2020-10-31 17:00:00 +0000\n"
let fmter = DateFormatter()
fmter.timeZone = TimeZone(identifier: "America/Chicago")!
fmter.dateStyle = .full
fmter.timeStyle = .full
print("Date is ", fmter.string(from: date)) // "Date is Sunday, 1 November 2020 18:00:00 Central Standard Time\n"
print("Yesterday's date is ", fmter.string(from: date.add(.day, value: -1))) // "Yesterday's date is Saturday, 31 October 2020 18:00:00 Central Daylight Time\n"
print("Noon time is ", fmter.string(from: date.noon)) // "Noon time is Sunday, 1 November 2020 12:00:00 Central Standard Time\n"
print("Yesterday date from noon's date is ",fmter.string(from: date.noon.add(.day, value: -1))) // "Yesterday date from noon's date is Saturday, 31 October 2020 12:00:00 Central Daylight Time\n"
推荐阅读
- python - 使用地图创建一个元组,带有条件的偶数或奇数列表
- java - 无法在列表中的列表中单击 WebElement
- parsing - TextFSM nxos 模板
- python - `with open`多个`findall`但打开文件一次
- ruby - 在Ruby中的同一行中打印不同大小数组的数组元素
- ms-access - id 随机变化的 getElementById
- spring-mvc - 无法在 Spring MVC 中进行日志记录
- java - 如何检查字段是否启用并迭代 10 多个下拉字段以在每个下拉列表中传递唯一值
- javascript - 如何将包含 HTML 的字符串解析为 React 组件
- python - 如何通过两个不同的视图将不同的数据呈现到同一页面 - Django