Estoy escribiendo una aplicación que utiliza datos centrales para almacenar mis datos. Incluido en este es un campo de fecha del cual solo me interesa la fecha, no el momento. necesito para seleccionar registros en base a la fecha (no la hora) y por eso he creado una categoría de NSDate para devolver una fecha, normalizada a una hora determinada de la siguiente manera:Práctica recomendada de NSDate al crear una fecha sin elemento de tiempo
+ (NSDate *)dateWithNoTime:(NSDate *)dateTime {
if(dateTime == nil) {
dateTime = [NSDate date];
}
NSDateComponents* comps = [[NSCalendar currentCalendar] components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit fromDate:dateTime];
NSDate *dateOnly = [[NSCalendar currentCalendar] dateFromComponents:comps];
[dateOnly dateByAddingTimeInterval:(60.0 * 60.0 * 12.0)]; // Push to Middle of day.
return dateOnly;
}
que entonces Úselo cuando agregue datos al almacén de datos básicos (tengo un sistema que usa este método para establecer el valor de fecha primitiva) y luego uso este método para crear una fecha que utilizo para comparar las fechas cuando realizo una solicitud de recuperación . Entonces, en teoría, esto siempre debería funcionar, es decir, elegir las fechas que estoy buscando.
Estoy un poco nervioso, aunque no estoy totalmente seguro de qué efecto tendrá el cambio de zona horaria o localidad. ¿Seguirá funcionando?
Lo que se considera la mejor práctica al almacenar y buscar en una fecha solo cuando no está interesado en el momento.
Saludos.
EDITAR
Después de leer la discusión recomienda Creo que debo modificar mi código para ser el siguiente. La idea es que si me aseguro de llevarlo a un sistema de calendario específico y una zona horaria específica (UTC), las fechas siempre deben ser las mismas independientemente de dónde se encuentre cuando configure la fecha y cuando lea la fecha. Cualquier comentario sobre este nuevo código apreciado.
+ (NSDate *)dateWithNoTime:(NSDate *)dateTime {
if(dateTime == nil) {
dateTime = [NSDate date];
}
NSCalendar *calendar = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease];
[calendar setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]];
NSDateComponents *components = [[[NSDateComponents alloc] init] autorelease];
components = [calendar components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit
fromDate:dateTime];
NSDate *dateOnly = [calendar dateFromComponents:components];
[dateOnly dateByAddingTimeInterval:(60.0 * 60.0 * 12.0)]; // Push to Middle of day.
return dateOnly;
}
¡Gracias por la solución! : D Sólo una pequeña corrección: La línea: '[dateOnly dateByAddingTimeInterval: (60,0 * 60,0 * 12,0)];' debe ser: 'dateOnly = [dateOnly dateByAddingTimeInterval: (60,0 * 60,0 * 12,0)];' –