2010-07-14 9 views
7

Estoy tratando de usar [[NSCalendar currentCalendar] ordinalityOfUnit:NSDayCalendarUnit inUnit:NSEraCalendarUnit forDate:date] en dos fechas diferentes para ver si caen en el mismo día. Sin embargo, si mi zona horaria es diferente (por ejemplo, en algún lugar de Alemania), aunque las fechas son obviamente las mismas, los días devueltos son diferentes. Si utilizo NSYearCalendarUnit en lugar de NSEraCalendarUnit en las mismas fechas, los valores devueltos son los mismos.NSCalendar obteniendo la diferencia de días incorrecta

El único problema con el uso de NSYearCalendarUnit es que devuelve el mismo valor para el mismo día de años diferentes, y no es fácil determinar el número de días entre dos fechas si caen en años diferentes.

¿Alguna idea de qué es lo que está mal o cómo determinar más fácilmente si dos fechas están en el mismo día, o para determinar el número de días entre ellas?

Ejemplo:

[NSTimeZone setDefaultTimeZone:[NSTimeZone timeZoneWithName:@"Europe/Berlin"]]; 
NSCalendar *cal = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 

NSDate *date1 = [NSDate dateWithTimeIntervalSinceReferenceDate:300751200]; 
NSDate *date2 = [NSDate dateWithTimeIntervalSinceReferenceDate:300836062.388569]; 

NSLog(@"\nDate 1: %@\nDate 2: %@",date1,date2); 
/*Output: 
Date 1: 2010-07-14 00:00:00 +0200 
Date 2: 2010-07-14 23:34:22 +0200 
*/ 

int day1 = [cal ordinalityOfUnit:NSDayCalendarUnit inUnit:NSEraCalendarUnit 
         forDate:date1]; 
int day2 = [cal ordinalityOfUnit:NSDayCalendarUnit inUnit:NSEraCalendarUnit 
         forDate:date2]; 

NSLog(@"\nDay 1: %i\nDay 2: %i",day1,day2); 
/*Output: 
    Day 1: 733966 
    Day 2: 733967 
*/ 

day1 = [cal ordinalityOfUnit:NSDayCalendarUnit inUnit:NSYearCalendarUnit 
        forDate:date1]; 
day2 = [cal ordinalityOfUnit:NSDayCalendarUnit inUnit:NSYearCalendarUnit 
        forDate:date2]; 

NSLog(@"\nDay 1:%i\nDay 2: %i",day1,day2); 
/*Output: 
    Day 1: 195 
    Day 2: 195 
*/ 
+0

Tengo el mismo problema. Parece que la era comienza en un tiempo fijo, digamos 00:00:01 1. Enero del año 1 GMT. NSYearCalendarUnit parece comenzar el 00:00:01 1. de enero, pero en la zona horaria NSCalendar, que puede no ser GMT. Esto podría explicar por qué los resultados de época/año difieren. Voy a completar el informe de errores. Esto hace que el método de ordinalidad sea inútil para la diferencia de días si los días no están en el mismo año. –

Respuesta

2

Ver http://developer.apple.com/mac/library/documentation/Cocoa/Reference/Foundation/Classes/NSCalendar_Class/Reference/NSCalendar.html: “Discusión

El ordinalidad es en la mayoría de los casos no es el mismo que el valor descompuesto de la unidad. Típicamente los valores de retorno son 1 y mayor. Por ejemplo, el tiempo 00:45 es en la primera hora del día, y para las unidades Hora y Día, respectivamente, el resultado sería 1. Una excepción es el cálculo de la semana en el mes, que devuelve 0 días antes de la primera semana en el mes que contiene la fecha. "

En otras palabras: 23:34:22 pertenece a la última hora del día, llegando a 0. El tiempo que corre sobre el cero es equivalente a: el día siguiente.

Quizás esto podría tratarse como un error: horas en un día desde el primero sobre el vigésimo hasta el zeroth? Sugiero: complete un informe de error.

+0

No estoy seguro de entender ... Las dos fechas son obviamente el mismo día, pero no aparecen el mismo día dentro de la época, pero sí aparecen el mismo día del año. Supongo que un informe de error está en orden, pero ¿hay alguna solución mientras tanto? –

+1

Depende de cuándo comienza la era, ¿no? Si la era comienza a la medianoche * GMT * algún año, entonces sus dos fechas no están en el mismo día (en el tiempo de la era). – JeremyP

6

Presenté un error, pero luego revisé Date and Time Programming Guide nuevamente. Si usa el código de la lista 13 (similar al suyo), se comporta mal. Pero si usa la lista 14, funciona como se esperaba.

EDITAR: Conceptualmente, Apple tiene razón. Jesucristo (como todos los demás) nació en tiempo absoluto, independientemente de los husos horarios. Entonces, la nueva era comenzó en el mismo punto de tiempo, independientemente de las zonas horarias. Año nuevo está en un punto diferente de tiempo en cada zona horaria. Esto podría explicar las diferencias entre NSYearCalendarUnit y NSEraCalendarUnit. El problema es que no expresaron esto explícitamente en los documentos.

Cuestiones relacionadas