Tengo una consulta sobre NSDate. Tengo una fecha, es decir, "2011-10-04 07:36:38 +0000", y quiero verificar si esta fecha es ayer, o hoy o una fecha futura.Compruebe si una fecha especificada es hoy, ayer o una fecha futura
¿Cómo podría hacerlo?
Tengo una consulta sobre NSDate. Tengo una fecha, es decir, "2011-10-04 07:36:38 +0000", y quiero verificar si esta fecha es ayer, o hoy o una fecha futura.Compruebe si una fecha especificada es hoy, ayer o una fecha futura
¿Cómo podría hacerlo?
Prueba esto:
Nota: Cambiar el formato de fecha según su necesidad.
NSDateFormatter* df = [[NSDateFormatter alloc] init];
[df setDateFormat:@"MM/dd/yyyy"];
NSDate* enteredDate = [df dateFromString:@"10/04/2011"];
NSDate * today = [NSDate date];
NSComparisonResult result = [today compare:enteredDate];
switch (result)
{
case NSOrderedAscending:
NSLog(@"Future Date");
break;
case NSOrderedDescending:
NSLog(@"Earlier Date");
break;
case NSOrderedSame:
NSLog(@"Today/Null Date Passed"); //Not sure why This is case when null/wrong date is passed
break;
}
utilizar cualquiera de los folowing según la necesidad ur,
– earlierDate:
– laterDate:
– compare:
esto no está disponible para el desarrollo de iOS. Desde el sitio, es claramente así: "Disponibilidad \t Disponible en OS X v10.0 y posterior." – JHHoang
Ver Apple's documentation on date calculations:
NSDate *startDate = ...;
NSDate *endDate = ...;
NSCalendar *gregorian = [[NSCalendar alloc]
initWithCalendarIdentifier:NSGregorianCalendar];
NSUInteger unitFlags = NSMonthCalendarUnit | NSDayCalendarUnit;
NSDateComponents *components = [gregorian components:unitFlags
fromDate:startDate
toDate:endDate options:0];
NSInteger months = [components month];
NSInteger days = [components day];
Si days
es entre +1 y -1, entonces su fecha es un candidato para ser "hoy". Obviamente, tendrá que pensar en cómo maneja horas. Presumiblemente, lo más fácil sería establecer todas las fechas a las 00: 00.00 horas del día en cuestión (truncate the date using an approach like this), y luego usar esos valores para el cálculo. De esta forma obtendría 0 por hoy, -1 por ayer, +1 por mañana, y cualquier otro valor también le diría qué tan lejos estaban las cosas en el futuro o en el pasado.
Esto funcionará, pero para evitar errores en los cambios del horario de verano, establecer las horas al mediodía (12:00:00) es mucho más seguro. – Suz
Irónicamente, originalmente sugerí establecer las horas hasta el mediodía, pero el ejemplo para truncar lo tenía configurado para la medianoche y pensé que también podría mantenerlo constante. Sin embargo, si ambas fechas están en la misma zona horaria, esto no cambiará, ya que los cambios de horario de verano tienen lugar a las 2 a.m., configurando los relojes a la 1am, por lo que en todos los casos dos fechas de la misma zona horaria se truncarán a las mismas fechas del calendario , independientemente de los ahorros de luz diurna. –
Si realmente desea tener en cuenta zonas horarias, el mejor enfoque sería transformar ambas fechas en la misma zona horaria antes de hacer cualquier otra cosa. –
-(NSString*)timeAgoFor:(NSString*)tipping_date
{
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyy-MM-dd"];
NSDate *date = [dateFormatter dateFromString:tipping_date];
NSString *key = @"";
NSTimeInterval ti = [date timeIntervalSinceDate:[NSDate date]];
key = (ti > 0) ? @"Left" : @"Ago";
ti = ABS(ti);
NSDate * today = [NSDate date];
NSComparisonResult result = [today compare:date];
if (result == NSOrderedSame) {
return[NSString stringWithFormat:@"Today"];
}
else if (ti < 86400 * 2) {
return[NSString stringWithFormat:@"1 Day %@",key];
}else if (ti < 86400 * 7) {
int diff = round(ti/60/60/24);
return[NSString stringWithFormat:@"%d Days %@", diff,key];
}else {
int diff = round(ti/(86400 * 7));
return[NSString stringWithFormat:@"%d Wks %@", diff,key];
}
}
Lo usé pero de alguna manera Hoy nunca llegó, así que tuve que modificarlo para que solo lo comparara la fecha. El resto funciona bien. Finalmente entendí que estaba comparando el tiempo con eso. Tuve que ajustarme en consecuencia – ChArAnJiT
debe haber un descanso después de cada declaración de caso para no ingresar en los otros casos. –
Tenga en cuenta que esto nunca volverá "hoy": NSDate representa un instante específico en el tiempo, por lo que 'NSOrderedSame' (esencialmente) nunca sucederá – Tim