EST 日期时区没有正确地加起来 swift 5

问题描述

我正在尝试将当前时间加起来最多 2 小时。当它是“亚洲/加尔各答”时,以下功能有效,但如果是“美国/多伦多”,它会减少 2 小时而不是增加时间。请查看下面的代码并在我错的地方遮住一些光线。 TIA

let Now = Date().localDate() // 2021-03-16 06:24:44 +0000 //extension of localDate
let modifiedDate = Calendar.current.date(byAdding: .hour,value: 2,to: Now)!
let hour = Calendar.current.dateComponents([.hour],from: modifiedDate,to: Now).hour //-2
let formatter = DateFormatter()
let timezone = TimeZone.current.identifier
formatter.timeZone = TimeZone(abbreviation: "America/Toronto")
formatter.locale = Calendar.current.locale
formatter.dateFormat = "yyyy-MM-dd HH:mm:ss ZZZ"
self.dateString = formatter.string(from: modifiedDate)
print("Date: ",self.dateString) //2021-03-16 04:24:44 -0400
 
extension Date {
    func localDate() -> Date {
    let NowUTC = Date()
    let timeZoneOffset = Double(TimeZone.current.secondsFromGMT(for: NowUTC))
    guard let localDate = Calendar.current.date(byAdding: .second,value: Int(timeZoneOffset),to: NowUTC) else {return Date()}

    return localDate
    }
}

解决方法

您的扩展名完全错误。没有“nowUTC”。现在在世界任何地方。日期没有时区,它只是一个时间点。你永远不应该从 GMT 到你的 Date() / now 对象添加/减去秒

为了更容易解释那里的错误,您只需要使用带语言环境的日期方法描述并使用当前。另请注意,向日期添加秒数永远不会失败,因此可以安全地强制打开结果。在那里使用守卫是没有意义的,失败时不返回 Date()。您应该将返回类型更改为可选的 Date 并返回 nil,但在这种情况下没有必要:


同样,以下扩展是你永远不应该做的

extension Date {
    func localDate() -> Date {
        let nowUTC = Date()
        let timeZoneOffset = Double(TimeZone.current.secondsFromGMT(for: nowUTC))
        return Calendar.current.date(byAdding: .second,value: Int(timeZoneOffset),to: nowUTC)!
    }
}

现在是巴西里约热内卢的 13:06,localDate 方法返回的日期是“巴西利亚标准时间,星期二,2021 年 3 月 16 日上午 10:06:13”

Date().localDate().description(with: .current) // Tuesday,March 16,2021 at 10:06:13 AM Brasilia Standard Time"


如果您需要“本地日期”,您只需要使用 Date()。如果您想显示本地日期,您需要使用 DateFormatter。当您打印日期对象时,它将始终显示 UTC 时间 (+0000)。如果您想打印本地日期,只需打印当前语言环境的描述。

let now = Date()
now.description(with: .current)  //  "Tuesday,2021 at 1:06:13 PM Brasilia Standard Time"