首页 > 解决方案 > 当夏令时结束时,在 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。

是我做错了什么还是其他问题?

如何重现:-


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

任何帮助,将不胜感激。

标签: iosswiftiphonexcode12xcode11.3

解决方案


编辑/更新:

您的代码没有任何问题。您的问题是您正在打印 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"

推荐阅读