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: