LoginSignup
33
33

More than 5 years have passed since last update.

[Swift]TwitterやFacebookの様に、日時を「n秒前」や「n日前」で表示するextension

Last updated at Posted at 2015-05-03

SNSなどの日時表示で使われているアレです。簡易的ではありますが、お役に立てられれば嬉しいです。

※以下の関数をswiftで書き直させていただいたものになります :bow:
fuzzy_time.php (Gist)

実行例

現在日時を2015/5/3 18:00:00とした場合、

test.swift
println(NSDate.parse("2015-05-03T18:00:00+09:00").toFuzzy()) // 0秒前
println(NSDate.parse("2015-05-03T17:59:59+09:00").toFuzzy()) // 1秒前
println(NSDate.parse("2015-05-03T17:30:00+09:00").toFuzzy()) // 30分前
println(NSDate.parse("2015-05-01T18:000:00+09:00").toFuzzy()) // 2日前
println(NSDate.parse("2015-01-01T18:000:00+09:00").toFuzzy()) // 1月1日
println(NSDate.parse("2014-05-03T18:000:00+09:00").toFuzzy()) // 2014年5月3日

仕様

  • 1分未満は n秒前
  • 1時間未満は n分前
  • 1日未満は n時間前
  • 31日以内は n日前
  • 32日以上前の場合は M月d日
  • 32日以上前で、現在と年が違う場合は yyyy年M月d日

コード

extension.swift
extension NSDate {
    func toFuzzy() -> String {
        let now = NSDate()

        let cal = NSCalendar.currentCalendar()
        let calUnit: NSCalendarUnit = .CalendarUnitSecond | .CalendarUnitMinute | .CalendarUnitHour | .CalendarUnitDay | .CalendarUnitYear
        let components = cal.components(calUnit, fromDate: self, toDate: now, options: nil)

        let diffSec = components.second + components.minute*60 + components.hour*3600 + components.day*86400 + components.year*31536000
        var result = String()

        if diffSec < 60 {
            result = "\(diffSec)秒前"
        } else if diffSec < 3600 {
            result = "\(diffSec/60)分前"
        } else if diffSec < 86400 {
            result = "\(diffSec/3600)時間前"
        } else if diffSec < 2764800 {
            result = "\(diffSec/86400)日前"
        } else {
            let dateFormatter = NSDateFormatter()

            if components.year > 0 {
                dateFormatter.dateFormat = "yyyy年M月d日"
                result = dateFormatter.stringFromDate(self)
            } else {
                dateFormatter.dateFormat = "M月d日"
                result = dateFormatter.stringFromDate(self)
            }
        }

        return result
    }

    class func parse(dateString:String) -> NSDate {
        let formatter = NSDateFormatter()
        formatter.dateFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ssZZZZZ"
        let d = formatter.dateFromString(dateString)
        return NSDate(timeInterval: 0, sinceDate: d!)
    }
}
33
33
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
33
33