2017-07-18 11 views
0

良いフォーマットとロジックで時刻を文字列として表示しようとするときに、Swift 3に問題があります。Swift 3 - 時間を文字列として表示する方法(各5分)

コンテキスト

私達のユーザーが当社のサーバーに私たちに情報を送信することができます。私はそれらの情報をAppに表示し、それに関するいくつかの統計を行っています。

たとえば、最初の情報が投稿されてからの経過時間を計算して表示します。

私は最も古いユーザー情報(タイムスタンプとして)を持っており、経過時間を表示したいと考えています。

たとえば、経過時間(最初の情報が投稿されて以降)が0〜5分の場合です。

"最後5分に投稿されたXの情報" - > [0-5]分

"最後10分に投稿されたXの情報" - >] 5-10]分

最後の時間に投稿されたXの情報」 - > 1時間、より

は、どのように私は、この特定のケースを処理し、迅速にこれを行うために私を可能にするソリューションすることができます。

これは私がこれまでにやっていることです: 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

ここにあなたを助けることができる拡張子です。あなたはそれを理解する任意の助けが必要な場合は、この

let timePeriod = (oldestInfoDate as Date).relativeTime 

のようにそれを使用することができます

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 "" 
} 
} 

、私に知らせてください。

+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)") 
     } 
    } 
} 
関連する問題