SNSなどの日時表示で使われているアレです。簡易的ではありますが、お役に立てられれば嬉しいです。
※以下の関数をswiftで書き直させていただいたものになります
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!)
}
}