如果给定的日期格式发生变化,如何格式化日期字符串
Posted
技术标签:
【中文标题】如果给定的日期格式发生变化,如何格式化日期字符串【英文标题】:How to format date string if the given date format changes 【发布时间】:2020-12-22 02:54:59 【问题描述】:我从 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
之间变化,当它变为@987654325 @,我现在的代码不能再格式化了。
问题:即使服务器给定的格式有时间,我如何格式化它?
【问题讨论】:
为什么不把“00:00:00”换成“”? @koropok 你是什么意思?,我没有包含 00:00:00 的代码.. @koropok00:00:00
只是一个例子,如果它有一个“ 11:11:11”呢?
哦,这个怎么样? strFromApi.components(separatedBy: " ").first
【参考方案1】:
您可以创建两个日期格式化程序,一个带时间,另一个不带时间,并使用 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"
【讨论】:
以上是关于如果给定的日期格式发生变化,如何格式化日期字符串的主要内容,如果未能解决你的问题,请参考以下文章