2017-07-18 170 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)") 
     } 
    } 
} 
相關問題