obtener NSDate hoy, ayer, esta semana, la semana pasada, este mes, el último mes … variables

Lo que bash hacer es obtener NSDate hoy, ayer, esta semana, la semana pasada, este mes, las últimas variables del mes listas para la comparación para los encabezados que se agregarán en el título de UITableView titleForHeaderInSection

Lo que deseo se hace manualmente en el código a continuación para la fecha 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"]; 

Adaptado de la Guía de progtwigción de fecha y hora :

 // 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]; 

Si desea la cantidad exacta de días según el mes, debe usar un NSCalendar .

Podría ser una mejor manera de escribir esto, pero aquí descubrí lo que surgió en la sugerencia de NSCalendar de Ben y trabajando desde allí hasta 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 es agradable de obtener hoy:

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

Esto crea un NSDate con solo año, mes y fecha:

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

Para obtener ayer, etc. puedes calcularlo 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) 

En Swift 3 , tenga en cuenta que los componentes de fecha son opcionales.

Las otras respuestas simplemente no funcionaron para mí (tal vez debido a mi zona horaria). Así es como lo hago:

 - (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; } 

Si usa iOS 10+ o MacOS 10.12+, puede usar estos dos métodos de Calendar para hacerlo correctamente.

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

Aquí hay un ejemplo de cómo usar estos métodos en Swift 3, junto con la salida de juegos infantiles en mi zona horaria.

 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 

Bonificación: puede utilizar los DateInterval para comprobar si una fecha cae en ese rango. Continuando desde arriba:

 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]; 

Me gusta mucho el objeto THCalendarInfo contenido en este proyecto:

http://github.com/jaredholdcroft/kcalendar

No puedo encontrar el original. Al usar este objeto, puede pasar a un día anterior, al comienzo de una semana, al comienzo de un mes, obtener el día de una semana, el día de un mes … etc., etc.

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

Esto es para verificar que la fecha sea este mes 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 } 

Y el segundo solo cambia el tipo de calendarioUnit para débiles como este

 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 } 

Espero que esto sea útil para alguien. Gracias.

Respondí una pregunta similar y esta es la razón por la cual mi respuesta es mejor:

  • Swift 3 !
  • Utiliza “Yesterday” y “Today” de DateFormatter. ¡Esto ya ha sido traducido por Apple, lo que le ahorra trabajo!
  • Utiliza la cadena traducida de “1 semana” de DateComponentsFormatter. (De nuevo, menos trabajo para usted, cortesía de Apple.) Todo lo que tiene que hacer es traducir la cadena “% @ ago”. 🙂
  • Las otras respuestas calculan incorrectamente el tiempo cuando el día cambia de “hoy” a “ayer”, etc. Las constantes fijas son un gran NO-NO porque las razones . Además, las otras respuestas usan la fecha / hora actual cuando deberían usar el final de la fecha / hora del día actual .
  • Utiliza la actualización automática de Calendario y configuración regional, lo que garantiza que su aplicación esté actualizada de inmediato con el calendario del usuario y las preferencias de idioma en Settings.app