使用 Swift 将 UTC 日期转换为本地时间:添加的小时数而不是删除的小时数
Converting a UTC date to a local time with Swift: hours added instead of hours removed
我正在尝试将 UTC 日期转换为当前时区,但发现时间问题。
我在大溪地/法属波利尼西亚 (UTC-10) 和当前时间(使用格式:yyyy/MM/dd HH:mm:ss)是:2018/08 /0506:45:00
Google 表示 UTC 时间为:2018/08/05 16:45:00
使用下面的代码,结果是:2018/08/06 02:45:42 +0000(后天)而不是 2018/08/05 06:45:42 +0000(今天)。
将 Date() 转换为当前时区 添加 10 小时 而不是 删除 10 小时。
我的错误在哪里?
Swift 3
import Foundation
extension Date {
var toLocalTimezone : Date {
let formatter = DateFormatter()
formatter.dateFormat = "yyyy/MM/dd' 'HH:mm:ss"
formatter.timeZone = TimeZone(secondsFromGMT:0) // UTC
let defaultTimeZoneStr = formatter.string(from: self)
let dateFormatter = DateFormatter()
formatter.timeZone = TimeZone.current // Local
dateFormatter.dateFormat = "yyyy/MM/dd' 'HH:mm:ss"
return dateFormatter.date(from:defaultTimeZoneStr)!
}
}
debugPrint("\(TimeZone.current)")
debugPrint("Locale time : \(Date().toLocalTimezone.toFormat(format: DateFormats.yyyyMMddHHmmss))" )
结果:
"Current timezone : Pacific/Tahiti (current)"
"Locale time : 2018-08-06 02:45:42"
而不是:
"Locale time : 2018-08-05 06:45:42"
其实很简单。 timeZone
属性 of DateFormatter
告诉 DateFormatter
从 Date
生成的字符串 应该在哪个时区 OR 您要将 转换为 Date
.
的字符串是什么时区
这对你来说意味着什么?
let formatter = DateFormatter()
formatter.dateFormat = "yyyy/MM/dd' 'HH:mm:ss"
formatter.timeZone = TimeZone(secondsFromGMT:0) // UTC
let defaultTimeZoneStr = formatter.string(from: self)
这意味着您正在将 Date
格式化为 String
,结果 String
将在 TimeZone(secondsFromGMT:0)
中
另一方面:
let dateFormatter = DateFormatter()
formatter.timeZone = TimeZone.current // Local
dateFormatter.dateFormat = "yyyy/MM/dd' 'HH:mm:ss"
return dateFormatter.date(from:defaultTimeZoneStr)!
您告诉格式化程序您在 TimeZone.current
中有一个 String
,它将尝试从中创建一个 Date
。
Date
始终是 GMT+0,您应该使用其他 API (DateFormatter
) 将其转换为输出格式和时区。
我的理解是,您正在尝试创建一个函数,该函数将使用自定义格式和用户时区输出格式化为 String
的 Date
。这是我相信您正在寻找的片段:
extension Date {
func format(_ format: String) -> String {
let formatter = DateFormatter()
formatter.dateFormat = format
formatter.timeZone = TimeZone.current // Local
return formatter.string(from: self)
}
}
我正在尝试将 UTC 日期转换为当前时区,但发现时间问题。
我在大溪地/法属波利尼西亚 (UTC-10) 和当前时间(使用格式:yyyy/MM/dd HH:mm:ss)是:2018/08 /0506:45:00
Google 表示 UTC 时间为:2018/08/05 16:45:00
使用下面的代码,结果是:2018/08/06 02:45:42 +0000(后天)而不是 2018/08/05 06:45:42 +0000(今天)。
将 Date() 转换为当前时区 添加 10 小时 而不是 删除 10 小时。
我的错误在哪里?
Swift 3
import Foundation
extension Date {
var toLocalTimezone : Date {
let formatter = DateFormatter()
formatter.dateFormat = "yyyy/MM/dd' 'HH:mm:ss"
formatter.timeZone = TimeZone(secondsFromGMT:0) // UTC
let defaultTimeZoneStr = formatter.string(from: self)
let dateFormatter = DateFormatter()
formatter.timeZone = TimeZone.current // Local
dateFormatter.dateFormat = "yyyy/MM/dd' 'HH:mm:ss"
return dateFormatter.date(from:defaultTimeZoneStr)!
}
}
debugPrint("\(TimeZone.current)")
debugPrint("Locale time : \(Date().toLocalTimezone.toFormat(format: DateFormats.yyyyMMddHHmmss))" )
结果:
"Current timezone : Pacific/Tahiti (current)"
"Locale time : 2018-08-06 02:45:42"
而不是:
"Locale time : 2018-08-05 06:45:42"
其实很简单。 timeZone
属性 of DateFormatter
告诉 DateFormatter
从 Date
生成的字符串 应该在哪个时区 OR 您要将 转换为 Date
.
这对你来说意味着什么?
let formatter = DateFormatter()
formatter.dateFormat = "yyyy/MM/dd' 'HH:mm:ss"
formatter.timeZone = TimeZone(secondsFromGMT:0) // UTC
let defaultTimeZoneStr = formatter.string(from: self)
这意味着您正在将 Date
格式化为 String
,结果 String
将在 TimeZone(secondsFromGMT:0)
另一方面:
let dateFormatter = DateFormatter()
formatter.timeZone = TimeZone.current // Local
dateFormatter.dateFormat = "yyyy/MM/dd' 'HH:mm:ss"
return dateFormatter.date(from:defaultTimeZoneStr)!
您告诉格式化程序您在 TimeZone.current
中有一个 String
,它将尝试从中创建一个 Date
。
Date
始终是 GMT+0,您应该使用其他 API (DateFormatter
) 将其转换为输出格式和时区。
我的理解是,您正在尝试创建一个函数,该函数将使用自定义格式和用户时区输出格式化为 String
的 Date
。这是我相信您正在寻找的片段:
extension Date {
func format(_ format: String) -> String {
let formatter = DateFormatter()
formatter.dateFormat = format
formatter.timeZone = TimeZone.current // Local
return formatter.string(from: self)
}
}