在DateFormatter扩展内包括日期转换器功能

时间:2019-03-23 20:40:29

标签: swift watchkit dateformatter

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

该代码有效,但是调用似乎很冗长。这是可以重构的东西吗?我可以将两者结合吗?

使DateFormatter的{​​{1}}函数具有convertDateFormater属性似乎是合乎逻辑的。没有错误,但是尝试的呼叫没有成功。

请发布带有代码的答案,以便我将其标记为正确。

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

1 个答案:

答案 0 :(得分:1)

您正在方法内部创建日期格式化程序,这可能会很昂贵。您可能希望将两者都保存在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))

这既简洁又避免了格式化程序的冗余实例化。

我个人会使用dateFormat,而不是在dateOnly中使用dateStyle,因此日期字符串(大概显示在UI中)已正确定位,但是您可以执行任何操作你要。

(顺便说一下,我在手机上打了这个,所以我很抱歉如果有语法错误,但是希望这可以说明基本思想。)


如果creationDate已经是Date,那么您就不需要这些iso专用内容。我的答案是基于您的以String作为参数的方法。如果已经是Date,那么它就是:

row.creationDateLabel.setText(DateFormatter.dateOnly.string(from: value.creationDate))