Swift 在DateFormatter扩展中包含日期转换器函数
扩展格式化API日期,然后转换器函数将其转换为我喜欢的格式 代码可以工作,但调用似乎冗长。这是可以重构的吗?我能把两者结合起来吗 将Swift 在DateFormatter扩展中包含日期转换器函数,swift,watchkit,dateformatter,Swift,Watchkit,Dateformatter,扩展格式化API日期,然后转换器函数将其转换为我喜欢的格式 代码可以工作,但调用似乎冗长。这是可以重构的吗?我能把两者结合起来吗 将convertdateformatter函数的DateFormatter设置为iso8601Full属性似乎是合乎逻辑的。没有错误,但尝试的呼叫无效 请张贴一个带有代码的答案,以便我能将其标记为正确 extension DateFormatter { static let iso8601Full: DateFormatter = { let
convertdateformatter
函数的DateFormatter
设置为iso8601Full
属性似乎是合乎逻辑的。没有错误,但尝试的呼叫无效
请张贴一个带有代码的答案,以便我能将其标记为正确
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!)
}
召唤
您正在方法中创建日期格式化程序,这可能会很昂贵。您可能希望在static中保存这两个选项:
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中)是正确本地化的,但您可以做任何您想做的事情
(顺便说一句,我是在手机上输入的,如果有语法错误,我深表歉意,但希望这能说明基本思想。)
如果
creationDate
已经是日期
,那么您不需要任何iso特定的内容。我的回答是基于您的方法,该方法将字符串作为参数。如果它已经是一个日期,那么它只是:
row.creationDateLabel.setText(DateFormatter.dateOnly.string(from: value.creationDate))
谢谢我在label调用中得到无法将类型“Date”的值转换为预期的参数类型“String”
。我不确定,但我不认为这是因为我的模型中的creationDate类型是Date。如果它已经是日期
,那么你不需要任何iso特定的东西。我的回答是基于您的方法,该方法将字符串作为参数。如果已经是日期
,请参见上面的修订答案。我正在使用formatter.dateStyle=.short
,就像您建议的那样。很好。
row.creationDateLabel.setText(DateFormatter.dateOnly.string(from: value.creationDate))