繁体   English   中英

EST 日期时区不能正确加起来小时 swift 5

[英]EST date timezone doesn't add up hours properly swift 5

我正在尝试将当前时间最多添加 2 个小时。 当它是“亚洲/加尔各答”时,下面的 function 有效,但如果它是“美国/多伦多”,它会将时间减少 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() / 现在 object

为了更容易解释哪里出了问题,您只需要使用带有语言环境的 Date 方法描述并使用 current。 另请注意,向日期添加秒数永远不会失败,因此可以安全地强制展开结果。 在那里使用警卫是没有意义的,并且在失败时不要返回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。 当您打印日期 object 时,它将始终显示 UTC 时间 (+0000)。 如果要打印本地日期,只需使用当前语言环境打印描述。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM