[英]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.