【问题标题】:Include a date converter function inside of a DateFormatter extension在 DateFormatter 扩展中包含日期转换器功能
【发布时间】:2019-03-23 20:40:28
【问题描述】:

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

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

convertDateFormater 函数的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!)
    }

打电话

row.creationDateLabel.setText("\(convertDateFormater(date: DateFormatter.iso8601Full.string(from: value.creationDate)))")

【问题讨论】:

    标签: swift watchkit dateformatter


    【解决方案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))
    

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

    就个人而言,我会使用dateStyle,而不是在dateOnly 中使用dateFormat,这样日期字符串(大概显示在UI 中)已正确本地化,但您可以为所欲为。

    (顺便说一句,这是我在手机上输入的,如果有任何语法错误,我深表歉意,但希望这能说明基本思想。)


    如果creationDate 已经是Date,那么您不需要任何特定于iso 的东西。我的答案基于您将String 作为参数的方法。如果它已经是Date,那么它只是:

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

    【讨论】:

    • 谢谢。我在标签电话中收到Cannot convert value of type 'Date' to expected argument type 'String'。我不确定,但我不认为这是因为我的模型中的 creationDate 是 Date 类型。
    • 如果它已经是 Date,那么你就不需要任何特定于 iso 的东西。我的答案基于您将String 作为参数的方法。如果它已经是Date,请参阅上面的修订答案。
    • 我正在使用formatter.dateStyle = .short,就像你建议的那样。挺好的。
    猜你喜欢
    • 2022-01-23
    • 2012-12-08
    • 1970-01-01
    • 2020-11-14
    • 2021-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多