iphone - util - itunes
obtener NSDate hoy, ayer, esta semana, la semana pasada, este mes, el último mes... variables (12)
Lo que intento 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 programació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
.
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.
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;
}
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.
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];
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:( NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit ) 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);
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 already . 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
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?
( docs ) -
func dateInterval(of component: Calendar.Component, for date: Date) -> DateInterval?
( docs )
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
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.
+ (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];
}
NSDate *today = [NSDate date]; // Today''s date
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *weekdayComponents =[gregorian componentsNSDayCalendarUnit | NSWeekdayCalendarUnit) fromDate:today];
NSInteger day = [weekdayComponents day];
NSDate *today = [[NSDate alloc] initWithTimeIntervalSinceNow:0];