2011-12-02 18 views
5

Sto usando UIDatePicker nella mia app e quando prendo la data che è stato scelto con:UIDatePicker ritorno sbagliato NSDate

NSDate *date = picker.date; 

picker.date restituito il giorno prima della data che ho scelto.

qualche idea del motivo?

+0

Si sta utilizzando un UIImagePicker (come nella domanda) o un UIDatePicker (come nel titolo della domanda)? Stai personalizzando il raccoglitore di date in qualche modo? –

+0

errore mio, sto usando UIDatePicker – MTA

risposta

8

UIDatePicker sarà la visualizzazione di date e orari nel fuso orario locale. Tuttavia, NSDate non ha alcun concetto di fuso orario poiché memorizza un numero assoluto di secondi da una data di riferimento. Quando NSLogging una data, mostra la data e l'ora in GMT. Mi aspetto che se elimini la differenza di fuso orario locale rispetto a GMT, vedrai che è la data corretta.

Provare a creare un NSDateFormatter o NSCalendar con le impostazioni internazionali appropriate e passare la data attraverso quella.

Per ulteriori informazioni su questo argomento comune, vedere this site written by another SO contributor.

+0

Io scelgo di dare all'utente solo di scegliere la data senza tempo – MTA

+2

Non c'è NSDate senza tempo. Semplicemente non lo stai visualizzando. La risposta è sempre la stessa. – jrturton

+0

stesso problema qui. corretto aggiungendo 'setTimeZone:' & 'setLocale:' al mio UIDatePicker. – HelmiB

1

Hai controllato il fuso orario?

Quando si stampa un NSDate verrà utilizzato GMT come fuso orario.

Se si imposta il fuso orario del sistema su NSDateFormatter si potrebbe ottenere un'altra data, perché richiederà il fuso orario e calcolerà l'ora di conseguenza.

aggiungere questo codice e vedere se l'uscita è corretta:

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

così come posso ottenere solo la data che è stata scelta dall'utente – MTA

+0

Hai la data selezionata dall'utente, ma non hai il fuso orario. il fuso orario utilizzato id del sistema attuale. – rckoenes

5

dare una prova ha funzionato per me

 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]; 

// sto output miniera in un etichetta che si può usare tutto quello che vuoi

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

Ricordarsi di creare il NSDate e poi emetterlo con un fuso orario e un calendario validi!

NSDate rappresenta solo un punto nel tempo assoluto. Non ha alcun concetto di fuso orario (NY, Barcellona, ​​...) o calendario (gregoriano, ebraico, ...).

UIDatePicker ritorna di default un NSDate con il sistema NSCalendar e NSTimeZone, ma quando si tenta di stampare in un secondo momento, non si formatta l'output. Potresti avere la mancata corrispondenza.

Quindi, per prima cosa è necessario configurare UIDatePicker correttamente e 2 ° trasformare l'uscita con NSDateFormatter in modo che conosca il calendario e il fuso orario utilizzato.

Un codice di esempio con l'init del UIDatePicker e poi stampare il risultato:

- (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]; 

} 

Controllare la risposta che ho fatto per un'altra domanda molto simile:

NSDate output using NSDateFormatter

1

Basta aggiungere una riga di codice

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

0 è per GMT 00. Aggiungi in base al tuo fuso orario.