【问题标题】:Adding/Reducing day in the Date object returns wrong date when day light savings time ends夏令时结束时,在 Date 对象中添加/减少日期返回错误日期
【发布时间】:2020-11-03 05:53:48
【问题描述】:

我正在使用

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

任何帮助将不胜感激。

【问题讨论】:

标签: ios swift iphone xcode12 xcode11.3


【解决方案1】:

编辑/更新:

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

【讨论】:

  • 我的要求是我需要使用午夜时间(一天的开始)。无论如何,11 月 2 日的返回日期对象应该是 10 月 31 日。在其他情况下,它会给出正确的响应。
  • 只需使用中午并获取结果日期的开始日期stackoverflow.com/a/44009988/2303865
  • 您的时区标识符是什么?请添加minimal reproducible example 没有办法从中午减去 1 天并导致不同的时间/日期
  • 我使用了这个时区标识符“HST”。我已经用更多细节更新了这个问题。
  • 已更新。标识符是 America/Chicago
猜你喜欢
  • 2012-06-01
  • 2011-04-30
  • 2017-02-16
  • 1970-01-01
  • 2015-11-23
  • 1970-01-01
  • 1970-01-01
  • 2023-02-07
  • 1970-01-01
相关资源
最近更新 更多