ricevi NSDate oggi, ieri, questa settimana, l’ultima settimana, questo mese, lo scorso mese … le variabili

Sto cercando di ottenere NSDate oggi, ieri, questa settimana, la settimana scorsa, questo mese, le variabili del mese scorso pronte per il confronto delle intestazioni da aggiungere su titlePerHeaderInSection di UITableView

Quello che voglio è fatto manualmente nel codice qui sotto per la data 2009-12-11

NSDate *today = [NSDate dateWithString:@"2009-12-11 00:00:00 +0000"]; NSDate *yesterday = [NSDate dateWithString:@"2009-12-10 00:00:00 +0000"]; NSDate *thisWeek = [NSDate dateWithString:@"2009-12-06 00:00:00 +0000"]; NSDate *lastWeek = [NSDate dateWithString:@"2009-11-30 00:00:00 +0000"]; NSDate *thisMonth = [NSDate dateWithString:@"2009-12-01 00:00:00 +0000"]; NSDate *lastMonth = [NSDate dateWithString:@"2009-11-01 00:00:00 +0000"]; 

Adattato dalla Guida alla programmazione di data e ora :

 // Right now, you can remove the seconds into the day if you want NSDate *today = [NSDate date]; // All intervals taken from Google NSDate *yesterday = [today dateByAddingTimeInterval: -86400.0]; NSDate *thisWeek = [today dateByAddingTimeInterval: -604800.0]; NSDate *lastWeek = [today dateByAddingTimeInterval: -1209600.0]; // To get the correct number of seconds in each month use NSCalendar NSDate *thisMonth = [today dateByAddingTimeInterval: -2629743.83]; NSDate *lastMonth = [today dateByAddingTimeInterval: -5259487.66]; 

Se si desidera il numero esatto corretto di giorni a seconda del mese, è necessario utilizzare un NSCalendar .

Potrebbe essere un modo migliore per scrivere questo, ma qui quello che ho trovato sul suggerimento NSCalendar di Ben e lavorare da lì a NSDateComponents

 NSCalendar *cal = [NSCalendar currentCalendar]; NSDateComponents *components = [cal components:( NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond ) fromDate:[[NSDate alloc] init]]; [components setHour:-[components hour]]; [components setMinute:-[components minute]]; [components setSecond:-[components second]]; NSDate *today = [cal dateByAddingComponents:components toDate:[[NSDate alloc] init] options:0]; //This variable should now be pointing at a date object that is the start of today (midnight); [components setHour:-24]; [components setMinute:0]; [components setSecond:0]; NSDate *yesterday = [cal dateByAddingComponents:components toDate: today options:0]; components = [cal components:NSWeekdayCalendarUnit | NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit fromDate:[[NSDate alloc] init]]; [components setDay:([components day] - ([components weekday] - 1))]; NSDate *thisWeek = [cal dateFromComponents:components]; [components setDay:([components day] - 7)]; NSDate *lastWeek = [cal dateFromComponents:components]; [components setDay:([components day] - ([components day] -1))]; NSDate *thisMonth = [cal dateFromComponents:components]; [components setMonth:([components month] - 1)]; NSDate *lastMonth = [cal dateFromComponents:components]; NSLog(@"today=%@",today); NSLog(@"yesterday=%@",yesterday); NSLog(@"thisWeek=%@",thisWeek); NSLog(@"lastWeek=%@",lastWeek); NSLog(@"thisMonth=%@",thisMonth); NSLog(@"lastMonth=%@",lastMonth); 

NSDateComponents è bello da ottenere oggi:

 NSCalendar *cal = [NSCalendar currentCalendar]; NSDate *date = [NSDate date]; NSDateComponents *comps = [cal components:(NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit) fromDate:date]; NSDate *today = [cal dateFromComponents:comps]; 

Ciò crea un NSDate con solo anno, mese e data:

 (gdb) po today 2010-06-22 00:00:00 +0200 

Per ottenere ieri, ecc. Puoi calcolarlo usando NSDateComponents:

 NSDateComponents *components = [[NSDateComponents alloc] init]; [components setDay:-1]; NSDate *yesterday = [cal dateByAddingComponents:components toDate:today options:0]; 
 + (NSDate*)dateFor:(enum DateType)dateType { NSCalendar *calendar = [NSCalendar currentCalendar]; NSDateComponents *comps = [calendar components:NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit fromDate:[NSDate date]]; if(dateType == DateYesterday) { comps.day--; } else if(dateType == DateThisWeek) { comps.weekday = 1; } else if(dateType == DateLastWeek) { comps.weekday = 1; comps.week--; } else if(dateType == DateThisMonth) { comps.day = 1; } else if(dateType == DateLastMonth) { comps.day = 1; comps.month--; } else if(dateType != DateToday) return nil; return [calendar dateFromComponents:comps]; } 

Swift 2

 let today = NSDate() let yesterday = today.dateByAddingTimeInterval(-86400.0) let thisWeek = today.dateByAddingTimeInterval(-604800.0) let lastWeek = today.dateByAddingTimeInterval(-1209600.0) let thisMonth = today.dateByAddingTimeInterval(-2629743.83) let lastMonth = today.dateByAddingTimeInterval(-5259487.66) // components of the date let calendar = NSCalendar(identifier: NSCalendarIdentifierGregorian) let components = calendar.components([.Year, .Month, .Day], fromDate: today) let (year, month, day) = (components.year, components.month, components.day) 

Swift 3

 let today = Date() let yesterday = today.addingTimeInterval(-86400.0) let thisWeek = today.addingTimeInterval(-604800.0) let lastWeek = today.addingTimeInterval(-1209600.0) let thisMonth = today.addingTimeInterval(-2629743.83) let lastMonth = today.addingTimeInterval(-5259487.66) // components of the date var calendar = Calendar(identifier: Calendar.Identifier.gregorian) let components = calendar.dateComponents([.year, .month, .day], from: today) let (year, month, day) = (components.year, components.month, components.day) 

In Swift 3 , si noti che i componenti della data sono opzionali.

Le altre risposte non hanno funzionato per me (forse a causa del mio fuso orario). Ecco come lo faccio:

 - (BOOL)isOnThisWeek:(NSDate *)dateToCompare { NSCalendar * calendar = [NSCalendar currentCalendar]; NSDate * today = [NSDate date]; int todaysWeek = [[calendar components: NSWeekCalendarUnit fromDate:today] week]; int dateToCompareWeek = [[calendar components: NSWeekCalendarUnit fromDate:dateToCompare] week]; int todaysYear = [[calendar components:NSYearCalendarUnit fromDate:today] year]; int dateToCompareYear = [[calendar components:NSYearCalendarUnit fromDate:dateToCompare] year]; if (todaysWeek == dateToCompareWeek && todaysYear == dateToCompareYear) { return YES; } return NO; } 

Se utilizzi iOS 10+ o MacOS 10.12+, puoi utilizzare questi due metodi di Calendar per farlo correttamente.

  • func date(byAdding component: Calendar.Component, value: Int, to date: Date, wrappingComponents: Bool = default) -> Date? ( documenti )
  • func dateInterval(of component: Calendar.Component, for date: Date) -> DateInterval? ( documenti )

Ecco un esempio di come utilizzare questi metodi in Swift 3, insieme all’output dei campi da gioco nel mio fuso orario.

 let calendar = Calendar.current let now = Date() // => "Apr 28, 2017, 3:33 PM" let yesterday = calendar.date(byAdding: .day, value: -1, to: now) // => "Apr 29, 2017, 3:33 PM" let yesterdayStartOfDay = calendar.startOfDay(for: yesterday!) // => ""Apr 29, 2017, 12:00 AM" let thisWeekInterval = calendar.dateInterval(of: .weekOfYear, for: now) // => 2017-04-23 04:00:00 +0000 to 2017-04-30 04:00:00 +0000 let thisMonthInterval = calendar.dateInterval(of: .month, for: now) // => 2017-04-01 04:00:00 +0000 to 2017-05-01 04:00:00 +0000 let aDateInLastWeek = calendar.date(byAdding: .weekOfYear, value: -1, to: now) let lastWeekInterval = calendar.dateInterval(of: .weekOfYear, for: aDateInLastWeek!) // => 2017-04-16 04:00:00 +0000 to 2017-04-23 04:00:00 +0000 let aDateInLastMonth = calendar.date(byAdding: .month, value: -1, to: now) let lastMonthInterval = calendar.dateInterval(of: .weekOfYear, for: aDateInLastMonth!) // => 2017-03-26 04:00:00 +0000 to 2017-04-02 04:00:00 +0000 

Bonus: puoi usare DateInterval s per verificare se una data rientra in quell’intervallo. Continuando dall’alto:

 thisWeekInterval!.contains(now) // => true lastMonthInterval!.contains(now) // => false 
 NSDate *today = [NSDate date]; // Today's date NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; NSDateComponents *weekdayComponents =[gregorian componentsNSDayCalendarUnit | NSWeekdayCalendarUnit) fromDate:today]; NSInteger day = [weekdayComponents day]; 

Mi piace molto l’object THCalendarInfo contenuto in questo progetto:

http://github.com/jaredholdcroft/kcalendar

Non riesco a trovare l’originale. Usando questo object puoi spostarti al giorno precedente, all’inizio di una settimana, all’inizio di un mese, ottenere il giorno della settimana, il giorno del mese … ecc. Ecc.

 NSDate *today = [[NSDate alloc] initWithTimeIntervalSinceNow:0]; 

Questo è per controllare la data è questo mese o no

 func isOnThisMonth(dateToCompare: NSDate) -> Bool { let calendar: NSCalendar = NSCalendar.currentCalendar() let today: NSDate = NSDate() let todaysWeek: Int = calendar.components(NSCalendarUnit.Month, fromDate: today).month let dateToCompareWeek: Int = calendar.components(.Month, fromDate: dateToCompare).month let todaysYear: Int = calendar.components(NSCalendarUnit.Year, fromDate: today).year let dateToCompareYear: Int = calendar.components(NSCalendarUnit.Year, fromDate: dateToCompare).year if todaysWeek == dateToCompareWeek && todaysYear == dateToCompareYear { return true } return false } 

E il secondo cambia solo tipo di calendarUnit per debole come questo

 func isOnThisWeek(dateToCompare: NSDate) -> Bool { let calendar: NSCalendar = NSCalendar.currentCalendar() let today: NSDate = NSDate() let todaysWeek: Int = calendar.components(NSCalendarUnit.Weekday, fromDate: today).weekday let dateToCompareWeek: Int = calendar.components(.Weekday, fromDate: dateToCompare).weekday let todaysYear: Int = calendar.components(NSCalendarUnit.Year, fromDate: today).year let dateToCompareYear: Int = calendar.components(NSCalendarUnit.Year, fromDate: dateToCompare).year if todaysWeek == dateToCompareWeek && todaysYear == dateToCompareYear { return true } return false } 

Spero che questo sia utile a qualcuno Grazie.

Ho già risposto a una domanda simile ed ecco perché la mia risposta è migliore:

  • Swift 3 !
  • Utilizza DateFormatter “Ieri” e “Oggi”. Questo è già stato tradotto da Apple, che ti fa risparmiare lavoro!
  • Utilizza la stringa “1 settimana” già tradotta da DateComponentsFormatter. (Ancora meno lavoro per te, per gentile concessione di Apple.) Tutto quello che devi fare è tradurre la stringa “% @ ago”. 🙂
  • Le altre risposte calcolano erroneamente l’ora in cui il giorno passa da “oggi” a “ieri” a ecc. Le costanti fisse sono un grande NO-NO perché le ragioni . Inoltre, le altre risposte usano la data / ora corrente quando dovrebbero usare la fine della data / ora del giorno corrente .
  • Utilizza autoupdatingCurrent per Calendar e Locale che assicura che la tua app sia immediatamente aggiornata con le preferenze di calendario e lingua dell’utente in Settings.app