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

问题描述

我正在使用

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"

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...