Всякий раз, когда вы пытаетесь проанализировать строку даты фиксированного формата, вам нужно установить локаль форматера в специальную локаль 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».
Какая дата это?В зависимости от того, где вы живете, это может быть 5 июня 2018 года. Это может быть 6 мая 2018 года. Это может быть 18 мая 2006 года. Это очень неоднозначно.
Лучше использовать что-то вроде:
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"
}
}