Swift – 计算经过的时间需要太长时间?

Swift – 计算经过的时间需要太长时间?,第1张

概述我的服务器调用为我提供了每个数据的日期时间的 JSON数据,我想计算从现在到现在之间经过的时间并将其加载到我的数据结构中.我正在做的方式现在需要很长时间,我应该使用不同的设计实践吗?以下功能是我现在正在使用的功能 func dateDiff(_ dateStr:String) -> String { var timeAgo = "10m" let formatter = Date 我的服务器调用为我提供了每个数据的日期时间的 JSON数据,我想计算从现在到现在之间经过的时间并将其加载到我的数据结构中.我正在做的方式现在需要很长时间,我应该使用不同的设计实践吗?以下功能是我现在正在使用的功能

func dateDiff(_ dateStr:String) -> String {    var timeAgo = "10m"    let formatter = DateFormatter()    formatter.dateFormat = "yyyy-MM-dd' 'HH:mm:ss"    formatter.timeZone = NSTimeZone(name: "AST") as! TimeZone    let dateFormatter = DateFormatter()    dateFormatter.dateFormat = "yyyy-MM-dd' 'HH:mm:ss"    dateFormatter.timeZone = NSTimeZone(name: "AST") as! TimeZone    let Now = formatter.string(from: Date())    if let date = formatter.date(from: dateStr){        if let NowDate = formatter.date(from: Now){        let components = Calendar.current.dateComponents([.day,.hour,.minute,.second],from: date,to: NowDate)        let sec = components.second        let min = components.minute        let hours = components.hour        let days = components.day        if (sec! > 0){            if let secc = sec {                timeAgo = "\(secc)s"            }        }        if (min! > 0){            if let minn = min {                timeAgo = "\(minn)m"            }            }        if(hours! > 0){            if let houRSS = hours {                timeAgo = "\(houRSS)h"            }        }        if(days! > 0){            if let dayss = days {                timeAgo = "\(dayss)d"            }        }    }  }    return timeAgo}
解决方法 出于性能原因,您应该将日期格式化程序的实例化从方法中拉出来,因为这是众所周知的计算密集型.

我还建议使用DateComponentsFormatter来简化已用时间的格式.

因此,定义两个格式化程序:

let dateFormatter: DateFormatter = {    let _formatter = DateFormatter()    _formatter.dateFormat = "yyyy-MM-dd' 'HH:mm:ss"    _formatter.locale = Locale(IDentifIEr: "en_US_POSIX")    _formatter.timeZone = TimeZone(abbreviation: "AST")  // CurIoUs; we usually use `TimeZone(secondsFromGMT: 0)` (i.e. GMT/UTC/Zulu)    return _formatter}()let componentsFormatter: DateComponentsFormatter = {    let _formatter = DateComponentsFormatter()    _formatter.maximumunitCount = 1    _formatter.unitsstyle = .abbreviated    return _formatter}()

然后你的功能大大简化了:

func dateDiff(_ string: String) -> String? {    guard let date = dateFormatter.date(from: string) else { return nil }    return componentsFormatter.string(from: date,to: Date())}

另请注意:

>我直接使用TimeZone,而不是通过NSTimeZone进行往返;
>我将语言环境设置为en_US_POSIX,如果日期字符串的来源是Web服务或数据库,则应该为always use;
>我将“Now”转换为字符串并返回;只需直接使用Date();

唯一看起来可疑的事情是使用AST作为时区.通常日期字符串保存在GMT / UTC / Zulu中(例如,RFC 3339或ISO 8601).如果您可以控制,那可能是最佳做法,如果用户更改时区,可以避免出现问题;

总结

以上是内存溢出为你收集整理的Swift – 计算经过的时间需要太长时间?全部内容,希望文章能够帮你解决Swift – 计算经过的时间需要太长时间?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1002403.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-22
下一篇2022-05-22

发表评论

登录后才能评论

评论列表(0条)

    保存