如何解决如果给定的日期格式发生变化,如何格式化日期字符串
我收到来自 api 的响应,它是日期字符串,它的格式有时会发生变化,因此我需要对其进行动态格式化,
这是我的代码
import Foundation
func format(from: String?,fromFormat: String,to: String) -> String {
if from == nil { return "" }
let inputDateFormatter = DateFormatter()
inputDateFormatter.dateFormat = fromFormat
let date = inputDateFormatter.date(from: from ?? "")
let outputDateFormatter = DateFormatter()
outputDateFormatter.dateFormat = to
if let date = date {
return outputDateFormatter.string(from: date)
}
return "not formatted"
}
let strFromApi = "2020-12-22"
print(format(from: strFromApi,fromFormat: "yyyy-MM-dd",to: "d MMM yyyy"))
如您所见,我有一个可以成功格式化的代码,这里的问题是 strFromApi
变量来自 api,并且在 2020-12-22
和 2020-12-22 00:00:00
之间变化,当它更改为 2020-12-22 00:00:00
时,我当前的代码无法再对其进行格式化。
问题:即使来自服务器的给定格式有时间,我该如何格式化?
解决方法
您可以创建两个日期格式化程序,一个有时间,另一个没有时间,并使用 nil 合并运算符在第一个失败时提供后备。关于返回最终字符串时的日期格式,您应该尊重用户的设备区域设置和设置。向用户显示日期时只需使用 dateStyle 和 timeStyle :
extension Formatter {
static let date: DateFormatter = {
let formatter = DateFormatter()
formatter.calendar = Calendar(identifier: .iso8601)
formatter.locale = Locale(identifier: "en_US_POSIX")
formatter.dateFormat = "yyyy-MM-dd"
return formatter
}()
static let dateAndTime: DateFormatter = {
let formatter = DateFormatter()
formatter.calendar = Calendar(identifier: .iso8601)
formatter.locale = Locale(identifier: "en_US_POSIX")
formatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
return formatter
}()
static let localizedDate: DateFormatter = {
let formatter = DateFormatter()
formatter.dateStyle = .medium
formatter.timeStyle = .none
return formatter
}()
}
extension Date {
var localizedDate: String { Formatter.localizedDate.string(from: self) }
}
func formatted(from string: String?) -> String {
guard
let string = string,let date = Formatter.dateAndTime.date(from: string) ??
Formatter.date.date(from: string)
else { return "" }
return date.localizedDate
}
let strFromApi = "2020-12-22 00:00:00" // "2020-12-22" //
formatted(from: strFromApi) // "Dec 22,2020"
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。