Encontré los códigos para calcular la diferencia de días entre dos fechas here.
escribo un método:Obtener el número de días entre dos fechas de NSDate en una zona horaria particular
-(NSInteger)daysWithinEraFromDate:(NSDate *) startDate toDate:(NSDate *) endDate
{
NSCalendar *gregorian = [[NSCalendar alloc]
initWithCalendarIdentifier:NSGregorianCalendar];
NSInteger startDay=[gregorian ordinalityOfUnit:NSDayCalendarUnit
inUnit: NSEraCalendarUnit forDate:startDate];
NSInteger endDay=[gregorian ordinalityOfUnit:NSDayCalendarUnit
inUnit: NSEraCalendarUnit forDate:endDate];
return endDay-startDay;
}
Este método tiene un problema: no se puede considerar la cosa zona horaria. Incluso puedo añadir una línea como la siguiente:
[gregorian setTimeZone:[NSTimeZone localTimeZone]];
Mi código de prueba es la siguiente:
NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
NSString *strDate = @"2012-09-03 23:00:00";
NSDate *dateStart = [dateFormat dateFromString:strDate];
strDate = @"2012-09-04 01:00:00";
NSDate *dateEnd = [dateFormat dateFromString:strDate];
NSLog(@"Days difference between %@ and %@ is: %d days",[dateFormat stringFromDate:dateStart],[dateFormat stringFromDate:dateEnd],[self daysWithinEraFromDate:dateStart toDate:dateEnd]);
El resultado es: diferencia
días entre 23:00 2012-09-03 : 00 y 2012-09-04 01:00:00 es: 0 días
Quiero obtener 1 día como resultado por el número de midnig hts entre las dos fechas. Mi zona horaria es GMT +8. Pero este cálculo se basa en GMT, así que obtengo el número de días incorrecto. ¿Hay alguna forma de resolver este problema? Gracias.
Scott Lemmon método puede resolver mi problema. Vuelvo a escribir mi código como este:
-(NSInteger)daysWithinEraFromDate:(NSDate *) startDate toDate:(NSDate *) endDate
{
NSCalendar *gregorian = [[NSCalendar alloc]
initWithCalendarIdentifier:NSGregorianCalendar];
[gregorian setTimeZone:[NSTimeZone localTimeZone]];
NSDate *newDate1 = [startDate dateByAddingTimeInterval:[[NSTimeZone localTimeZone] secondsFromGMT]];
NSDate *newDate2 = [endDate dateByAddingTimeInterval:[[NSTimeZone localTimeZone] secondsFromGMT]];
NSInteger startDay=[gregorian ordinalityOfUnit:NSDayCalendarUnit
inUnit: NSEraCalendarUnit forDate:newDate1];
NSInteger endDay=[gregorian ordinalityOfUnit:NSDayCalendarUnit
inUnit: NSEraCalendarUnit forDate:newDate2];
return endDay-startDay;
}
Hola, gracias por tu respuesta. Solo pensé en ignorar la información del tiempo. He hecho esto en mis códigos. ¡Pero tu primera solución es brillante! Creo que es una forma más precisa de resolver este problema. Lo he intentado en mi código, se los mostraré. – Vigor