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?
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?
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.
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;
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;
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:
Basta aggiungere una riga di codice
self.datePicker.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:0];
0 è per GMT 00. Aggiungi in base al tuo fuso orario.
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? –
errore mio, sto usando UIDatePicker – MTA