微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

当夏令时结束时,日期对象中的添加/减少日期返回错误的日期

如何解决当夏令时结束时,日期对象中的添加/减少日期返回错误的日期

我正在使用

Calendar.current.date(byAdding: .day,value: -1,to: somedate) ?? somedate

从某个日期开始减少1天。由于夏令时于2020年11月1日结束。当我尝试在2020年11月2日执行此操作时,我希望它返回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"

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。