2014-12-05 20 views
11

Tôi có một số ngày mà tôi đang cố gắng trình bày bằng cách sử dụng ngày tương đối như "Hôm nay, Hôm qua, 1 tuần trước, 1 tháng trước" v.v ...Swift iOS doesRelativeDateFormatting có các giá trị khác nhau bên cạnh "Hôm nay" và "Hôm qua"?

Đây là mã Swift tôi đang sử dụng:

let dateFormatter = NSDateFormatter() 
dateFormatter.dateStyle = .MediumStyle 
dateFormatter.doesRelativeDateFormatting = true 
let uploadDate = dateFormatter.stringFromDate(date) 

Chỉ "Hôm nay" và "ngày hôm qua" được đại diện và phần còn lại của ngày xuất hiện như dưới đây: ngày 24 tháng 11 năm 2014 17 tháng mười một năm 2014 vv ...

có khác cách để đại diện cho tất cả các ngày sử dụng hẹn hò tương đối thay vì ngày thực tế ?

+0

Ý của bạn là "2 ngày trước", "1 tuần trước"? –

+0

https://github.com/melvitax/AFDateHelper Repo github này có chức năng ngày tương đối tốt mà bạn có thể chỉnh sửa cho phù hợp với dự án của mình. Hy vọng rằng sẽ giúp! – Ian

+0

@MikeTaverne Vâng, đó chính xác là những gì tôi đang cố gắng làm. –

Trả lời

1

Bạn nên có một cái nhìn tại Mattt Thompsons Blog bài về NSDateComponentsFormatter

http://nshipster.com/nsdatecomponents/http://nshipster.com/nsformatter/

let formatter = NSDateComponentsFormatter() 
formatter.unitsStyle = .Full 

let components = NSDateComponents() 
components.day = 1 
components.hour = 2 

let string = formatter.stringFromDateComponents(components) 
// 1 day, 2 hours 

Ví dụ (bởi Mattt Thompson)

21

chỉnh sửa/Cập nhật: Xcode 8.3. 2 • Swift 3.1

Nó là rất dễ dàng nếu bạn sử dụng phần mở rộng và phương pháp Lịch để giúp bạn với các tính toán calendrical của bạn: Kiểm tra

extension Date { 
    var yearsFromNow: Int { return Calendar.current.dateComponents([.year],  from: self, to: Date()).year  ?? 0 } 
    var monthsFromNow: Int { return Calendar.current.dateComponents([.month],  from: self, to: Date()).month  ?? 0 } 
    var weeksFromNow: Int { return Calendar.current.dateComponents([.weekOfYear], from: self, to: Date()).weekOfYear ?? 0 } 
    var daysFromNow: Int { return Calendar.current.dateComponents([.day],  from: self, to: Date()).day   ?? 0 } 
    var hoursFromNow: Int { return Calendar.current.dateComponents([.hour],  from: self, to: Date()).hour  ?? 0 } 
    var minutesFromNow: Int { return Calendar.current.dateComponents([.minute],  from: self, to: Date()).minute  ?? 0 } 
    var secondsFromNow: Int { return Calendar.current.dateComponents([.second],  from: self, to: Date()).second  ?? 0 } 
    var relativeTime: String { 
     if yearsFromNow > 0 { return "\(yearsFromNow) year" + (yearsFromNow > 1 ? "s" : "") + " ago" } 
     if monthsFromNow > 0 { return "\(monthsFromNow) month" + (monthsFromNow > 1 ? "s" : "") + " ago" } 
     if weeksFromNow > 0 { return "\(weeksFromNow) week" + (weeksFromNow > 1 ? "s" : "") + " ago" } 
     if daysFromNow > 0 { return daysFromNow == 1 ? "Yesterday" : "\(daysFromNow) days ago" } 
     if hoursFromNow > 0 { return "\(hoursFromNow) hour"  + (hoursFromNow > 1 ? "s" : "") + " ago" } 
     if minutesFromNow > 0 { return "\(minutesFromNow) minute" + (minutesFromNow > 1 ? "s" : "") + " ago" } 
     if secondsFromNow > 0 { return secondsFromNow < 15 ? "Just now" 
          : "\(secondsFromNow) second" + (secondsFromNow > 1 ? "s" : "") + " ago" } 
     return "" 
    } 
} 

let calendar = Calendar.current 

let date1 = DateComponents(calendar: calendar, year: 2016, month: 3, day: 14, hour: 22, minute: 39).date! 
let date2 = DateComponents(calendar: calendar, year: 2017, month: 5, day: 18, hour: 22, minute: 39).date! 
let date3 = DateComponents(calendar: calendar, year: 2017, month: 6, day: 2, hour: 12, minute: 38).date! 
let date4 = DateComponents(calendar: calendar, year: 2017, month: 6, day: 3, hour: 14, minute: 45).date! 
let date5 = DateComponents(calendar: calendar, year: 2017, month: 6, day: 3, hour: 15, minute: 18).date! 

let timeOffset1 = date1.relativeTime // "1 year ago" 
let timeOffset2 = date2.relativeTime // "2 weeks ago" 
let timeOffset3 = date3.relativeTime // "Yesterday" 
let timeOffset4 = date4.relativeTime // "33 minutes ago" 
let timeOffset5 = date5.relativeTime // "Just now" 
+4

'NSDateFormatter' được quốc tế hoá/bản địa hoá rất kỹ lưỡng. (Ví dụ, bạn chỉ nhận được ngày hôm nay/ngày hôm qua/ngày mai bằng tiếng Anh, nhưng các ngôn ngữ khác có các từ cho các ngày tương đối khác - ví dụ như - と と い và 明 後 日 trong tiếng Nhật - và lớp của Apple sử dụng chúng ('NSDateComponentsFormatter' rất địa phương để xử lý khoảng thời gian/ngày cũng vậy.) Nếu bạn làm điều gì đó như thế này, bạn đang chuyển gánh nặng xử lý tất cả các loại vấn đề định dạng ngày/giờ quốc tế từ Apple sang chính bạn. – rickster

+0

http://stackoverflow.com/a/32302797/ 2303865 –

0
var relativeTime: String { 
    // don't forget spacing on these constants. 
    let futurePrefix = "" // " in" is a viable choice here... 
    let pastSuffix = " ago" // " ago" is a viable choice here... 
    let now = NSDate() 
    for (method, unitName) in [ 
     (now.years, "year"), 
     (now.months, "month"), 
     (now.weeks, "week"), 
     (now.days, "day"), 
     (now.hours, "hour"), 
     (now.minutes, "minute"), 
     (now.seconds, "second") 
    ] { 
     let qty = method(self) 
     let absQty = abs(method(self)) 
     if absQty > 0 { 
      return (qty < 0 ? futurePrefix : "") + 
       String(absQty) + " " + 
       unitName + 
       (absQty == 1 ? "": "s") + 
       (qty > 0 ? pastSuffix : "") 
     } 
    } 
    return "" 
} 

An thực hiện thay thế thực hiện relativeTime Leo Dabus rằng làm cả tương lai lẫn quá khứ và gọn gàng hơn. (Swift2.3)

Các vấn đề liên quan