2017-07-18 162 views
0

我有一些问题,试图以良好的格式和逻辑显示时间作为字符串在Swift 3Swift 3 - 如何显示时间为字符串(每5分钟)

语境

我们的用户可以给我们发送信息到我们的服务器。我将这些信息显示在应用程序中,并对其进行统计。

例如,我想计算并显示自第一条信息发布以来的经过时间。

我有最旧的用户信息(作为时间戳),我想显示经过的时间。

例如,如果经过的时间(从现在起第一条信息发布起)为0到5分钟。

“贴在最后5分钟 X信息” - > [0-5]分钟

“X张贴信息在最后10分钟” - >] 5-10]分钟

“贴在最后一小时 X的信息” - > 1h和更

我该如何处理这个具体的案例和解决方案使我在迅速做到这一点。

这是我迄今所做的:

小号elf.info我的信息阵列(每个信息都有一个时间戳财产

private func getInformationTime() -> String { 

     //Get the oldest Information 
     let sortedArray = self.info.sorted(by: { $0.timestamp < $1.timestamp }) 
     let oldestInfoDate = Date(timeIntervalSince1970: (sortedArray.first?.timestamp)!) 
     let now = Date() 

     let formatter = DateComponentsFormatter() 
     formatter.unitsStyle = .short 
     formatter.allowedUnits = [.minute] 
     formatter.maximumUnitCount = 1 

     let string = formatter.string(from: oldestInfoDate as Date, to: now as Date) 

     return string! 
    } 

我这样调用它,它显示我这个:

let infoTime = self. getInformationTime()   
let message = "\(self.info.count) informations in \(infoTime)"   
print(message) 

结果244 informations in 184 min

结果是合适的,我有良好的数字和良好的时间价值。

我希望能够正确格式化它。

PS:我的应用程序使用国际让我必须能够把它在不同的语言(字符串文件)翻译。

回答

0

这里是一个扩展,它可以帮助你。

extension Date { 
func years(from date: Date) -> Int { 
    return Calendar.current.dateComponents([.year], from: date, to: self).year ?? 0 
} 
func months(from date: Date) -> Int { 
    return Calendar.current.dateComponents([.month], from: date, to: self).month ?? 0 
} 
func weeks(from date: Date) -> Int { 
    return Calendar.current.dateComponents([.weekOfYear], from: date, to: self).weekOfYear ?? 0 
} 
func days(from date: Date) -> Int { 
    return Calendar.current.dateComponents([.day], from: date, to: self).day ?? 0 
} 
func hours(from date: Date) -> Int { 
    return Calendar.current.dateComponents([.hour], from: date, to: self).hour ?? 0 
} 
func minutes(from date: Date) -> Int { 
    return Calendar.current.dateComponents([.minute], from: date, to: self).minute ?? 0 
} 
func seconds(from date: Date) -> Int { 
    return Calendar.current.dateComponents([.second], from: date, to: self).second ?? 0 
} 

var relativeTime: String { 
    let now = Date() 
    if now.years(from: self) > 0 { 
     return now.years(from: self).description + " year" + { return now.years(from: self) > 1 ? "s" : "" }() + " ago" 
    } 
    if now.months(from: self) > 0 { 
     return now.months(from: self).description + " month" + { return now.months(from: self) > 1 ? "s" : "" }() + " ago" 
    } 
    if now.weeks(from:self) > 0 { 
     return now.weeks(from: self).description + " week" + { return now.weeks(from: self) > 1 ? "s" : "" }() + " ago" 
    } 
    if now.days(from: self) > 0 { 
     if now.days(from:self) == 1 { return "Yesterday" } 
     return now.days(from: self).description + " days ago" 
    } 
    if now.hours(from: self) > 0 { 
     return "\(now.hours(from: self)) hour"  + { return now.hours(from: self) > 1 ? "s" : "" }() + " ago" 
    } 
    if now.minutes(from: self) > 0 { 
     return "\(now.minutes(from: self)) minute" + { return now.minutes(from: self) > 1 ? "s" : "" }() + " ago" 
    } 
    if now.seconds(from: self) > 0 { 
     if now.seconds(from: self) < 15 { return "Just now" } 
     return "\(now.seconds(from: self)) second" + { return now.seconds(from: self) > 1 ? "s" : "" }() + " ago" 
    } 
    return "" 
} 
} 

,你可以使用它像这样

let timePeriod = (oldestInfoDate as Date).relativeTime 

如果你需要了解它的任何帮助,不要让我知道。

+0

我只会自定义扩展名以显示我想要的方式。谢谢,我正在寻找什么。 – Balanced

0
let infoTimeValue = Int(infoTime) 

if let infoTimeValue = infoTimeValue{ 
    if infoTimeValue > 55{ 
     print("last hour") 
    }else{ 
     let lapseR = infoTimeValue % 5 
     let lapseQ = infoTimeValue/5 
     if lapseR > 0{ 
      let timePast = 5 * lapseQ + 5 
      print("time = \(timePast)") 
     }else if lapseR == 0{ 
      print("time = \(infoTimeValue)") 
     } 
    } 
} 
相关问题