2011-07-06 16 views
5

Mi aplicación utilizó la función [NSDate date] para obtener la fecha actual. Funciona bien otros días excepto 1 de cada mes durante AM. es decir Siga los siguientes pasos:NSDate devuelve una fecha incorrecta el primer día del mes

  1. Establecer la fecha del sistema como 01 - Junio ​​- 2011 & tiempo entre la medianoche 00.00 a 5.59 PM.
  2. Utilice el código siguiente:
    NSLog(@"Current Date :: %@",[NSDate date]);

La O/P es :: Fecha actual :: 2011-05-31 19:40:21 +0000

O deseado/P es :: Fecha actual :: 2011-06-01 00: 00: 0 (iethe tiempo que se fija) 0000

también de 06 a.m. funciona bien.

¿Cuál es la razón de esto?

En realidad, no quiero NSDate en formato de cadena, pero lo que quiero es el objeto de fecha NSDate correspondiente a la primera fecha del mes actual. Por lo que yo uso siguiente fragmento de código:

NSCalendar *gregorian = [[NSCalendar alloc]initWithCalendarIdentifier:NSGregorianCalendar]; 
[gregorian setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]]; 

NSDateComponents *comp = [gregorian components:(NSYearCalendarUnit | NSMonthCalendarUnit 
| NSDayCalendarUnit) fromDate:[NSDatedate]]; 

[comp setDay:1];  

NSDate *firstDayOfMonthDate = [gregorian dateFromComponents:comp]; 

[gregorian release]; 

return firstDayOfMonthDate; 

Desde [fecha NSDate] devuelve una fecha incorrecta, también contiene componentes fecha equivocada. El código anterior funciona para todos los senarios excepto el senario que publiqué en el comienzo de este hilo. ¿Que debería hacer?

+0

Dada esta información, no puedo pensar en una razón por la cual debería ser así. Quizás es un error? –

Respuesta

0

¿Está ejecutando iOS versión 4.2? Si es así, hay algún tipo de problema con el método de fecha, no parece respetar su zona horaria local. Por ejemplo, si se me acaba el código en el 4,0 simulador de iOS, consigo esta salida:

Current Date :: 2011-07-06 10:43:38 -0400

Pero si lo ejecuto en el 4,2 simulador de iOS, me sale esto:

Current Date :: 2011-07-06 14:44:18 +0000

Aquí hay otro SO post que describe esto con más detalle:

NSDate et al woes on iOS 4.2

Si usted está buscando para la fecha y hora actuales en un NSString, utilizo código que se parece a esto para llevar a cabo esa tarea:

NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 
[formatter setFormatterBehavior:NSDateFormatterBehavior10_4]; 
[formatter setDateStyle:NSDateFormatterShortStyle]; 
[formatter setTimeStyle:NSDateFormatterShortStyle]; 
NSString *result = [formatter stringFromDate:[NSDate date]]; 
[formatter release]; 
NSLog(@"Current Date v2 :: %@",result); 
+0

Pero quiero el objeto NSDate o NSDateComponents Obj y no una cadena. ¿Qué debo hacer? –

+0

esperando respuesta? –

2

Finalmente consiguió la solución:

El punto es, NSDate los objetos no tienen un huso horario asociado a ellos, y algunas versiones de alguien en Apple decidieron que el método de descripción de NSDate, que es el que usa NSLog, debe usar GMT + 0 y NO la zona horaria local para la salida. (Supongo que alguien tuvo un error donde corrompieron su configuración regional, y eso causó que el método de descripción de NSDate se bloquee, y así se archivaron los informes de error ...)

La versión corta: Use NSDateFormatter para dar salida a las fechas. No use -descripción.

+0

... o la subclase NSDate y escriba su propio método de descripción. –

+0

Es por eso que hay "+0000" en la descripción. – Sulthan

Cuestiones relacionadas