Swift 在DateFormatter扩展中包含日期转换器函数

Swift 在DateFormatter扩展中包含日期转换器函数,swift,watchkit,dateformatter,Swift,Watchkit,Dateformatter,扩展格式化API日期,然后转换器函数将其转换为我喜欢的格式 代码可以工作,但调用似乎冗长。这是可以重构的吗?我能把两者结合起来吗 将convertdateformatter函数的DateFormatter设置为iso8601Full属性似乎是合乎逻辑的。没有错误,但尝试的呼叫无效 请张贴一个带有代码的答案,以便我能将其标记为正确 extension DateFormatter { static let iso8601Full: DateFormatter = { let

扩展格式化API日期,然后转换器函数将其转换为我喜欢的格式

代码可以工作,但调用似乎冗长。这是可以重构的吗?我能把两者结合起来吗

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))