swift - 在 DateFormatter 扩展中包含一个日期转换器函数

标签 swift watchkit dateformatter

扩展程序格式化 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)))")

最佳答案

您正在您的方法中创建日期格式化程序,这可能很昂贵。您可能希望将两者都保存在静态的:

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 已经是一个 Date 那么您就不需要任何特定于 iso 的东西。我的回答基于您将 String 作为参数的方法。如果它已经是一个 Date 那么它只是:

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

关于swift - 在 DateFormatter 扩展中包含一个日期转换器函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55318163/

相关文章:

objective-c - Xcode 10.2 Swift 错误 : Function types cannot be represented in Objective-C unless their parameters and returns can be

ios - 我如何在 iOS Swift 的单个项目中使用两个 GMSMapViews

ios - 没有参数的函数调用错误中缺少参数 #1 的参数。 swift

ios - 我可以使用 watchOS2 从 WatchKit 应用程序发送网络电话吗?

ios - UITableViewCell 无法使用 Swift 动态调整大小

ios - 如何为 Appstore 提交验证 iOS/Watchkit 应用程序?

ios - Watchkit - 如何在组中设置元素一个在另一个下面

ios - 来自字符串时区的日期不符合使用 DateFormatter

ios - DateFormatter 在 iPhone 上返回 nil,但在模拟器上不返回

swift - 如何在swift中将 'Date'类型的值转换为 'String'