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

问题描述 投票:1回答:1

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

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

DateFormatterconvertDateFormater作为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!)
    }

呼叫

row.creationDateLabel.setText("\(convertDateFormater(date: DateFormatter.iso8601Full.string(from: value.creationDate)))")
swift watchkit dateformatter
1个回答
1
投票

您正在方法中创建日期格式化程序,这可能很昂贵。你可能想要保存在静态内部:

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))
© www.soinside.com 2019 - 2024. All rights reserved.