我以这种格式保存在数据库中的日期 - “yyyy-MM-dd'T'HH:mm:ssZ”。例如,“2018-05-17T11:15:00+0330”。时区有所不同,以用户本地时区为准。
我想检索并显示日期,如“2018 年 5 月 17 日上午 11 点 15 分”,将日期/时间保持在保存时的时区。我怎样才能做到这一点?
我试过这个。
let dateString = "2018-05-17T11:15:00+0330"
let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ"
//formatter.timeZone = ???
print(formatter.date(from: dateString))
但我获取本地时区的 Date 对象并将其转换为日期字符串,也显示本地时区的日期。
有没有这样的事情,https://stackoverflow.com/a/46216251/1373592 https://stackoverflow.com/a/46216251/1373592,在斯威夫特?
Thanks.
这是一个小扩展TimeZone
我刚刚振作起来。您可以使用它来创建一个TimeZone
来自 ISO8601 日期字符串。它将按以下格式处理字符串中的时区:
- Z(UTC 时间)
- +/-HH
- +/-HHmm
- +/-HH:mm
这是扩展:
extension TimeZone {
init?(iso8601: String) {
let tz = iso8601.dropFirst(19) // remove yyyy-MM-ddTHH:mm:ss part
if tz == "Z" {
self.init(secondsFromGMT: 0)
} else if tz.count == 3 { // assume +/-HH
if let hour = Int(tz) {
self.init(secondsFromGMT: hour * 3600)
return
}
} else if tz.count == 5 { // assume +/-HHMM
if let hour = Int(tz.dropLast(2)), let min = Int(tz.dropFirst(3)) {
self.init(secondsFromGMT: (hour * 60 + min) * 60)
return
}
} else if tz.count == 6 { // assime +/-HH:MM
let parts = tz.components(separatedBy: ":")
if parts.count == 2 {
if let hour = Int(parts[0]), let min = Int(parts[1]) {
self.init(secondsFromGMT: (hour * 60 + min) * 60)
return
}
}
}
return nil
}
}
还有一个测试:
print(TimeZone(iso8601: "2018-05-17T11:15:00+0330"))
您可以结合此解析和格式化,以便最终结果采用原始时区。
let dateString = "2018-05-17T11:15:00+0330"
let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ"
formatter.locale = Locale(identifier: "en_US_POSIX")
if let date = formatter.date(from: dateString), let tz = TimeZone(iso8601: dateString) {
let newFmt = DateFormatter()
newFmt.dateStyle = .medium
newFmt.timeStyle = .short
newFmt.timeZone = tz
let newString = newFmt.string(from: date)
print(newString)
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)