在 DateFormatter 扩展中包含一个日期转换器函数
Include a date converter function inside of a DateFormatter extension
扩展程序格式化 API 日期,然后转换器函数将其转换为我喜欢的格式。
代码有效,但调用似乎很冗长。这是可以重构的东西吗?我可以将两者结合起来吗?
将 convertDateFormater
函数的 DateFormatter
设为 iso8601Full
属性 似乎合乎逻辑。没有错误,但尝试的调用没有成功。
请post用代码回答,以便我标记正确。
extension DateFormatter {
static let iso8601Full: DateFormatter = {
let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
formatter.calendar = Calendar(identifier: .iso8601)
formatter.timeZone = TimeZone(secondsFromGMT: 0)
formatter.locale = Locale(identifier: "en_US_POSIX")
return formatter
}()
}
func convertDateFormater(date: String) -> String {
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
let date = dateFormatter.date(from: date)
dateFormatter.dateFormat = "dd/MM/yyyy"
return dateFormatter.string(from: date!)
}
通话
row.creationDateLabel.setText("\(convertDateFormater(date: DateFormatter.iso8601Full.string(from: value.creationDate)))")
您正在您的方法中创建日期格式化程序,这可能很昂贵。你可能想把两者都保存在静态的:
extension DateFormatter {
static let iso8601Full: DateFormatter = {
let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
formatter.calendar = Calendar(identifier: .iso8601)
formatter.timeZone = TimeZone(secondsFromGMT: 0)
formatter.locale = Locale(identifier: "en_US_POSIX")
return formatter
}()
static let dateOnly: DateFormatter = {
let formatter = DateFormatter()
formatter.dateFormat = "dd/MM/yyyy"
return formatter
}()
static func string(iso string: String) -> String {
let date = DateFormatter.iso8601Full.date(from: string)!
return DateFormatter.dateOnly.string(from: date)
}
}
然后你可以做:
row.creationDateLabel.setText(DateFormatter.string(iso: value.creationDate))
这既更简洁又避免了格式化程序的冗余实例化。
就个人而言,我不会在 dateOnly
中使用 dateFormat
,而是使用 dateStyle
,因此日期字符串(可能显示在 UI 中)已正确本地化, 但你可以做任何你想做的事。
(顺便说一下,我在 phone 上输入了这个,所以如果有任何语法错误,我深表歉意,但希望这能说明基本思想。)
如果 creationDate
已经是 Date
那么您不需要任何特定于 iso 的东西。我的回答基于您使用 String
作为参数的方法。如果它已经是 Date
那么它只是:
row.creationDateLabel.setText(DateFormatter.dateOnly.string(from: value.creationDate))
扩展程序格式化 API 日期,然后转换器函数将其转换为我喜欢的格式。
代码有效,但调用似乎很冗长。这是可以重构的东西吗?我可以将两者结合起来吗?
将 convertDateFormater
函数的 DateFormatter
设为 iso8601Full
属性 似乎合乎逻辑。没有错误,但尝试的调用没有成功。
请post用代码回答,以便我标记正确。
extension DateFormatter {
static let iso8601Full: DateFormatter = {
let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
formatter.calendar = Calendar(identifier: .iso8601)
formatter.timeZone = TimeZone(secondsFromGMT: 0)
formatter.locale = Locale(identifier: "en_US_POSIX")
return formatter
}()
}
func convertDateFormater(date: String) -> String {
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
let date = dateFormatter.date(from: date)
dateFormatter.dateFormat = "dd/MM/yyyy"
return dateFormatter.string(from: date!)
}
通话
row.creationDateLabel.setText("\(convertDateFormater(date: DateFormatter.iso8601Full.string(from: value.creationDate)))")
您正在您的方法中创建日期格式化程序,这可能很昂贵。你可能想把两者都保存在静态的:
extension DateFormatter {
static let iso8601Full: DateFormatter = {
let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
formatter.calendar = Calendar(identifier: .iso8601)
formatter.timeZone = TimeZone(secondsFromGMT: 0)
formatter.locale = Locale(identifier: "en_US_POSIX")
return formatter
}()
static let dateOnly: DateFormatter = {
let formatter = DateFormatter()
formatter.dateFormat = "dd/MM/yyyy"
return formatter
}()
static func string(iso string: String) -> String {
let date = DateFormatter.iso8601Full.date(from: string)!
return DateFormatter.dateOnly.string(from: date)
}
}
然后你可以做:
row.creationDateLabel.setText(DateFormatter.string(iso: value.creationDate))
这既更简洁又避免了格式化程序的冗余实例化。
就个人而言,我不会在 dateOnly
中使用 dateFormat
,而是使用 dateStyle
,因此日期字符串(可能显示在 UI 中)已正确本地化, 但你可以做任何你想做的事。
(顺便说一下,我在 phone 上输入了这个,所以如果有任何语法错误,我深表歉意,但希望这能说明基本思想。)
如果 creationDate
已经是 Date
那么您不需要任何特定于 iso 的东西。我的回答基于您使用 String
作为参数的方法。如果它已经是 Date
那么它只是:
row.creationDateLabel.setText(DateFormatter.dateOnly.string(from: value.creationDate))