我正在尝试将 UTC 日期时间转换为本地日期时间,下面是我的代码。
func dateTimeStatus(date: String) -> String{
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "MM/dd/yy hh:mm:ss a"
dateFormatter.timeZone = TimeZone(abbreviation: "UTC")
let dt = dateFormatter.date(from: date)
dateFormatter.timeZone = TimeZone.current
dateFormatter.dateFormat = "MM/dd/yy hh:mm:ss a"
return dateFormatter.string(from: dt!) // .string(from: dt!)
}
当系统(iPhone 或 iPad)语言设置为英语(印度) 时,以上代码集有效。如果我将语言更改为日语,则会抛出如下异常。
Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value
在 return
语句中。
我非常清楚,由于 dateFormatter.date(from: date) 无法识别 date(from: date),我搞砸了 dateFormatter。因此,将 nil 值分配给 dt。
任何关于对所有系统语言通用地使用日期时间格式的建议都是值得赞赏的。
最佳答案
每当您尝试解析固定格式的日期字符串时,您需要将格式化程序的区域设置为 en_US_POSIX
的特殊区域设置。这处理了许多可能的问题,包括用户的区域和语言,以及用户的 12/24 小时设置。
dateFormatter.locale = Locale(identifier: "en_US_POSIX")
然后将其重置为用户的区域设置以及时区。
dateFormatter.locale = Locale.current
你还应该避免强制解包,以防你得到一个意外的日期字符串。
更新代码:
func dateTimeStatus(date: String) -> String {
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "MM/dd/yy hh:mm:ss a"
dateFormatter.locale = Locale(identifier: "en_US_POSIX")
dateFormatter.timeZone = TimeZone(secondsFromGMT: 0)
if let dt = dateFormatter.date(from: date) {
dateFormatter.locale = Locale.current
dateFormatter.timeZone = TimeZone.current
dateFormatter.dateFormat = "MM/dd/yy hh:mm:ss a"
return dateFormatter.string(from: dt)
} else {
return "Unknown date"
}
}
在向用户显示日期/时间时,您还应该考虑使用日期和时间样式而不是固定格式。这可确保日期采用友好格式。在你的情况下,你有一个真正的问题。
假设您得到的结果是“06/05/18 10:30:00 am”。
那是几号?根据您居住的地点,可能是 2018 年 6 月 5 日。可能是 2018 年 5 月 6 日。可能是 2006 年 5 月 18 日。这非常模糊。
最好使用类似的东西:
func dateTimeStatus(date: String) -> String {
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "MM/dd/yy hh:mm:ss a"
dateFormatter.locale = Locale(identifier: "en_US_POSIX")
dateFormatter.timeZone = TimeZone(secondsFromGMT: 0)
if let dt = dateFormatter.date(from: date) {
let userFormatter = DateFormatter()
userFormatter.dateStyle = .medium // Set as desired
userFormatter.timeStyle = .medium // Set as desired
return userFormatter.string(from: dt)
} else {
return "Unknown date"
}
}
关于ios - 在 iOS 中将 UTC 日期时间转换为本地日期时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50712354/