2016-09-06 43 views
13

Belirli bir zaman damgasının bugün ya da +1/-1 gün içinde gerçekleşip gerçekleşmediğine nasıl karar vereceğim. Esasen, ben Önemlisi da, Swift olması gerekiyor ve ben NSDate/NSCalendar nesnelerle mücadele ediyorumSwift - bir zaman damgasının dün, bugün, yarın veya X gün önce olup olmadığını kontrol edin

IF days_from_today(timestamp) == -1 RETURN 'Yesterday' 
ELSE IF days_from_today(timestamp) == 0 RETURN 'Today' 
ELSE IF days_from_today(timestamp) == 1 RETURN 'Tomorrow' 
ELSE IF days_from_today(timestamp) < 1 RETURN days_from_today(timestamp) + ' days ago' 
ELSE RETURN 'In ' + days_from_today(timestamp) + ' ago' 

bu (sözde kod) Böyle bir şey yapmak istiyorum. Böyle saat farkını çalışma dışarı ile başladı: .Day gün ve zaman damgası saatine bağlı olarak farklı olduğu için

let calendar = NSCalendar.currentCalendar() 
let date = NSDate(timeIntervalSince1970: Double(timestamp)) 
let timeDifference = calendar.components([.Second,.Minute,.Day,.Hour], 
    fromDate: date, toDate: NSDate(), options: NSCalendarOptions()) 

Ancak bu şekilde karşılaştırarak, kolay değildir. PHP'de, günün başlangıcına (yani, mktime(0,0,0)) dayalı yeni bir tarih oluşturmak için mktime kullanacağım, ancak Swift'de bunu yapmanın en kolay yolu olduğundan emin değilim.

Bu yönteme nasıl yaklaşılacağı konusunda iyi bir fikri olan var mı? Belki de NSDate ya da benzer bir şey için bir uzantısı en iyi olurdu?

cevap

38

NSCalendar gün önce dünden daha hesaplamak unitFlags için

func components(_ unitFlags: NSCalendarUnit, 
     fromDate startingDate: NSDate, 
      toDate resultDate: NSDate, 
       options opts: NSCalendarOptions) -> NSDateComponents 

geçiş .Day kullanmak ve almak için her üç durumda

func isDateInYesterday(_ date: NSDate) -> Bool 
func isDateInToday(_ date: NSDate) -> Bool 
func isDateInTomorrow(_ date: NSDate) -> Bool 

için yöntemler vardır yardımcı olur day p sonuçtan rocele.

Düzenleme:

Bu kez parçasını sıyırma tarafından da daha önceki ve sonraki tarihlerde is in gördüğü bir fonksiyondur. Swift 3

func dayDifferenceFromDate(timestamp : Int) -> String 
{ 
    let calendar = NSCalendar.currentCalendar() 
    let date = NSDate(timeIntervalSince1970: Double(timestamp)) 
    if calendar.isDateInYesterday(date) { return "Yesterday" } 
    else if calendar.isDateInToday(date) { return "Today" } 
    else if calendar.isDateInTomorrow(date) { return "Tomorrow" } 
    else { 
    let startOfNow = calendar.startOfDayForDate(NSDate()) 
    let startOfTimeStamp = calendar.startOfDayForDate(date) 
    let components = calendar.components(.Day, fromDate: startOfNow, toDate: startOfTimeStamp, options: []) 
    let day = components.day 
    if day < 1 { return "\(abs(day)) days ago" } 
    else { return "In \(day) days" } 
    } 
} 

Güncelleme:

func dayDifference(from interval : TimeInterval) -> String 
{ 
    let calendar = NSCalendar.current 
    let date = Date(timeIntervalSince1970: interval) 
    if calendar.isDateInYesterday(date) { return "Yesterday" } 
    else if calendar.isDateInToday(date) { return "Today" } 
    else if calendar.isDateInTomorrow(date) { return "Tomorrow" } 
    else { 
     let startOfNow = calendar.startOfDay(for: Date()) 
     let startOfTimeStamp = calendar.startOfDay(for: date) 
     let components = calendar.dateComponents([.day], from: startOfNow, to: startOfTimeStamp) 
     let day = components.day! 
     if day < 1 { return "\(abs(day)) days ago" } 
     else { return "In \(day) days" } 
    } 
} 
+0

teşekkür ederiz! Üst kısım mükemmel görünüyor. Alt kısmı ile, burada 10:00 olabilir, ancak zaman damgası yarın 9 am olabilir, bu yarın 11:00 olsaydı farklı bir sonuç verirdi. Yoksa bunun nasıl çalıştığını anladım mı? – Ben

+0

Harika şeyler, tekrar teşekkürler. Yaptığım tek değişiklik, günler öncesindeki çizgiydi, olumsuzluğu ortadan kaldırmak için bir 'abs' ekleyerek, yani 'geri' \ (abs (gün)) gün önce "' – Ben

+0

Elbette teşekkürler – vadian

5

NSCalender, doğrudan kullanabileceğiniz yeni yöntemlere sahiptir.

NSCalendar.currentCalendar().isDateInTomorrow(NDSate())//Replace NSDate() with your date 
NSCalendar.currentCalendar().isDateInYesterday() 
NSCalendar.currentCalendar().isDateInTomorrow() 

Umut bu

25

Swift 3.0: Ek

NSCalendar.current.isDateInToday(yourDate) 
NSCalendar.current.isDateInYesterday(yourDate) 
NSCalendar.current.isDateInTomorrow(yourDate) 

:

NSCalendar.current.isDateInWeekend(yourDate) 

Bazı ülkeler için haftasonunun cumartesi-pazar gününden farklı olabileceğini, takvime bağlı olduğunu unutmayın.

Ayrıca, kullanıcı güncellemelerini izleyecek current takvim yerine autoupdatingCurrent'u da kullanabilirsiniz.

NSCalendar.autoupdatingCurrent.isDateInToday(yourDate) 

Güncelleme:

Ayrıca Calendar kullanabilirsiniz NSCalendar için bir tür takma addır Sen bunu aynı şekilde kullanabilirsiniz.

7

Swift 4 güncelleme:

let calendar = Calendar.current 
    let date = Date() 

    calendar.isDateInYesterday(date) 
    calendar.isDateInToday(date) 
    calendar.isDateInTomorrow(date)