2011-12-02 14 views
5

estoy usando UIDatePicker en mi aplicación y cuando tomo la fecha en que fue elegido con:UIDatePicker volver equivocada NSDate

NSDate *date = picker.date; 

picker.date regresaron el día antes de la fecha de haber elegido.

¿Alguna idea de por qué sucede?

+0

¿Está utilizando un UIImagePicker (como en su pregunta) o un UIDatePicker (como en el título de su pregunta)? ¿Estás personalizando el selector de fecha de alguna manera? –

+0

mi error, estoy usando UIDatePicker – MTA

Respuesta

8

UIDatePicker habrá que muestra las fechas y horas en su zona horaria local. Sin embargo, NSDate no tiene ningún concepto de zona horaria ya que almacena una cantidad absoluta de segundos desde una fecha de referencia. Cuando NSLogging una fecha, muestra la fecha y la hora en GMT. Supongo que si calculas la diferencia horaria local de GMT, verás que es la fecha correcta.

Intente crear un NSDateFormatter o NSCalendar con la configuración regional adecuada y pase la fecha a través de eso.

Para obtener más información sobre este tema común, consulte this site written by another SO contributor.

+0

elijo dar al usuario solo para elegir la fecha sin tiempo – MTA

+2

No hay NSDate sin tiempo. Simplemente no lo estás mostrando. La respuesta sigue siendo la misma. – jrturton

+0

mismo problema aquí. arreglado por agregar 'setTimeZone:' & 'setLocale:' a mi UIDatePicker. – HelmiB

1

¿Has comprobado la zona horaria?

Al imprimir un NSDate utilizará GMT como zona horaria.

Si configura la zona horaria del sistema en NSDateFormatter puede obtener otra fecha, ya que tomará la zona horaria y calculará el tiempo en consecuencia.

Añadir este código y ver si la salida es correcta:

NSDate *date = picker.date; 
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
[dateFormatter setDateStyle:NSDateFormatterMediumStyle]; 
[dateFormatter setTimeZone:NSDateFormatterNoStyle]; 
[dateFormatter setLocale:[NSLocale currentLocale]]; 
NSLog(@"Date: %@", [dateFormmater stringFromDate:date]); 
[dateFormatter release], dateFormatter = nil; 
+0

entonces, ¿cómo puedo obtener solo la fecha que eligió el usuario? – MTA

+0

Tiene la fecha que el usuario selecciona, pero no tiene la zona horaria. la zona horaria usa el ID del sistema actual. – rckoenes

5

dar a este un intento funcionó para mí

 NSDate* sourceDate = [NSDate date]; 

     NSTimeZone* sourceTimeZone = [NSTimeZone timeZoneWithAbbreviation:@"GMT"]; 
     NSTimeZone* destinationTimeZone = [NSTimeZone systemTimeZone]; 

     NSInteger sourceGMTOffset = [sourceTimeZone secondsFromGMTForDate:sourceDate]; 
     NSInteger destinationGMTOffset = [destinationTimeZone secondsFromGMTForDate:sourceDate]; 
     NSTimeInterval interval = destinationGMTOffset - sourceGMTOffset; 

     NSDate* destinationDate = [[[NSDate alloc] initWithTimeInterval:interval sinceDate:sourceDate] autorelease]; 

// Estoy salida mina en una etiqueta se puede usar lo que quiera

 NSString *dateOutput = [[[NSString alloc] initWithFormat:@"%@", destinationDate]autorelease]; 
     self.dateLabel.text = dateOutput; 
2

Recuerde que debe crear el NSDate y luego la salida se con una zona horaria y un calendario válidos

NSDate solo representa un punto absoluto en el tiempo. No tiene un concepto de zona horaria (NY, Barcelona, ​​...) o calendario (gregoriano, hebreo, ...).

UIDatePicker devuelve de forma predeterminada una NSDate con el sistema NSCalendar y NSTimeZone, pero cuando intenta imprimir más tarde, no da formato a la salida. Es posible que tenga allí el desajuste.

Por lo tanto, primero debe configurar el UIDatePicker correctamente y 2º transformar la salida con NSDateFormatter para conocer el calendario y la zona horaria que se está utilizando.

Un código de ejemplo, con el inicio de la UIDatePicker y luego imprimir el resultado:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    // init the UIDatePicker with your values 
    // by default UIDatePicker inits with today, system calendar and timezone 
    // Only for teaching purposes I will init with default values 
    NSDate * now = [[NSDate alloc] init]; 
    [_datePicker setDate: now] 
       animated: YES];  

    _datePicker.timeZone = [NSTimeZone localTimeZone]; 
    _datePicker.calendar = [NSCalendar currentCalendar]; 

    [_datePicker addTarget: self 
        action: @selector(getDatePickerSelection:) 
     forControlEvents:UIControlEventValueChanged]; 

} 


-(void)getDatePickerSelection:(id) sender 
{ 

    // NSDateFormatter automatically inits with system calendar and timezone 
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
    // Setup an output style 
    [dateFormatter setDateStyle:NSDateFormatterMediumStyle]; 
    [dateFormatter setTimeStyle:NSDateFormatterShortStyle]; 

    // Medium style date, short style time => "Nov 23, 1937 3:30pm" 
    NSString *dateString = [dateFormatter stringFromDate:date]; 

} 

Verifica el que hice para otra pregunta muy similar:

NSDate output using NSDateFormatter

1

Solo agregue una línea de código

self.datePicker.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:0]; 

0 es para GMT 00. Agregue según su zona horaria.