微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如何在 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")

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。