如何解决如何在 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 举报,一经查实,本站将立刻删除。