如何在 Swift 中执行正确的日期格式化程序

问题描述

我不确定如何使 dateFormatter 可重用,因为我读到 dateFormatter 多次执行确实很昂贵,并且如果可能的话我应该重用它。目前我的功能是这样的:

    func formatDate(date: String) -> String {
    let dateFormatterGet = DateFormatter()

    //this is format I get from my response
    dateFormatterGet.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"
    let dateFormatterSet = DateFormatter()

    //this is format I would like to show on my screen
    dateFormatterSet.dateFormat = "EEE,dd MMM YYYY,HH:mm a"
    let dateObj: Date? = dateFormatterGet.date(from: date)
    return dateFormatterSet.string(from: dateObj!)
}

如果我在一个屏幕上使用它我不会被打扰,但我在两个屏幕上使用它,但也许它也不贵,但我想知道在未来的情况下如何正确地做到这一点。

这是我另一个屏幕的功能唯一的区别是 dateFormatterSet,我用它在我的屏幕上显示不同的格式。

    func formatDate(date: String) -> String {
    let dateFormatterGet = DateFormatter()
    dateFormatterGet.dateFormat = "YYYY-MM-dd'T'HH:mm:ss.SSS'Z'"
    let dateFormatterSet = DateFormatter()
    dateFormatterSet.dateFormat = "EEE,dd MMM"
    guard let dateObj = dateFormatterGet.date(from: date) else { return "Start date 
    unkNown"}
    return dateFormatterSet.string(from: dateObj)
}

提前致谢。

解决方法

您不需要两个日期格式化程序来将一个日期字符串转换为另一个。

我的建议是创建一个具有固定语言环境的持久日期格式化程序

let dateFormatter : DateFormatter = {
    let formatter = DateFormatter()
    formatter.locale = Locale(identifier: "en_US_POSIX")
    return formatter
}()

这也可以是一个扩展

extension DateFormatter {
    static let posixFormatter : DateFormatter = {
        let formatter = DateFormatter()
        formatter.locale = Locale(identifier: "en_US_POSIX")
        return formatter
    }()
}

其次是一个带有输入格式参数的函数,具有默认值和输出格式

func formatDate(dateString: String,inFormat: String = "yyyy-MM-dd'T'HH:mm:ss.SSSZ",outFormat: String) -> String? {

    // let dateFormatter = DateFormatter.posixFormatter
   
    //this is format I get from my response
    dateFormatter.dateFormat = inFormat
    guard let date = dateFormatter.date(from: dateString) else { return nil }

    dateFormatter.dateFormat = outFormat
    return dateFormatter.string(from: date)
}

您必须检查是否可以从字符串创建日期,以便返回值是可选的。

附注:

ISO8601 字符串中的 Z 是时区说明符。它不能用单引号括起来。年份说明符始终是小写的 yyyy

,

我正在阅读有关日期格式有多昂贵的文章,并找到了一篇很好的文章,证明了它们为何如此昂贵以及它们是如何昂贵的。根据我的理解,我通过使用单例类和 Dateformatter 的扩展创建了一个解决方案。你可以在下面找到它。

我读过的文章:https://sarunw.com/posts/how-expensive-is-dateformatter/

class MyDateFormatter {
    static let sharedInstance = DateFormatter()
    private init() {
    }
}

extension DateFormatter{
    func getDateFrom(stringDate:String,format dateFormat:String)->Date?{
        let dateFormatter = MyDateFormatter.sharedInstance
        dateFormatter.dateFormat = dateFormat
        let dateObj: Date? = dateFormatter.date(from: stringDate)
        return dateObj
    }
    
    func getStringFrom(date:Date,format dateFormat:String)->String?{
        let dateFormatter = MyDateFormatter.sharedInstance
        dateFormatter.dateFormat = dateFormat
        let dateString: String? = dateFormatter.string(from: date)
        return dateString
    }
}

func formatDate(date: String) -> String {
    let dateObj:Date? = MyDateFormatter.sharedInstance.getDateFrom(stringDate: date,format: "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")
    let formattedDate:String? = MyDateFormatter.sharedInstance.getStringFrom(date: dateObj!,format: "EEE,dd MMM YYYY,HH:mm a")
    return formattedDate ?? ""
}

formatDate(date: "2011-11-02T02:50:12.208Z")

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...