2013-09-06 12 views
8

Sto riscontrando un problema con il Monotouch UIDatePicker in ritardo di 1 ora. Penso che questo abbia a che fare con i Fusi orari o qualcosa di simile. Ho provato a impostare in modo esplicito il fuso orario e le impostazioni internazionali del mio UIDatePicker, ma questo non sembra essere d'aiuto.Problema di fuso orario con UIDatePicker Data: 1 ora errata

datePicker.Locale = NSLocale.CurrentLocale; 
datePicker.TimeZone = NSTimeZone.LocalTimeZone; 

Nel gestore ValueChanged la seguente riga restituisce un valore di 1 ora prima del tempo selezionato nell'interfaccia utente:

var date = DateTime.SpecifyKind((s as UIDatePicker).Date, DateTimeKind.Local).ToLocalTime(); 

Nel ValueChanged Handler ho ricontrollato che le impostazioni internazionali e il fuso orario è uguale a ciò che è stato impostato. Il TimeZone è Europa/Dublino e Locale en_US. Queste informazioni sono state recuperate da:

datePicker.Locale.LocaleIdentifier; 
datePicker.DatePicker.TimeZone; 

C'è un altro passo che mi manca?

Grazie!

+0

È possibile che sia in vigore l'ora legale? Questo a volte può causare differenze orarie simili a quelle che sembra provate. –

risposta

9

La data restituita da DatePicker è in formato UTC. Esistono diversi metodi per convertire l'ora UTC in ora locale. Come gli stati di risposta this ToLocalTime è il migliore.

DateTime.SpecifyKind(datePicker.Date, DateTimeKind.Utc).ToLocalTime(); 
+1

Penso che questa sia la risposta corretta. Nel codice originale, l'OP ha specificato 'DateTimeKind.Local' invece di' DateTimeKind.Utc'. Dato che un 'NSDate' rappresenta UTC ma la conversione non imposta' .Kind', questo è il modo in cui devi farlo. –

+0

Ma datePicker.Date è un NSDate e il primo parametro del metodo DateTime.SpecifyKind è un DateTime ... – leoneboaventura

3

Dopo var date = DateTime ..., aggiungere il seguente:

if (date.IsDaylightSavingTime()) 
    date = date.AddHours (1); 
+0

L'ora legale non è sempre regolata di un'ora. http://www.timeanddate.com/time/dst/ http://infiniteundo.com/post/25509354022/more-falsehoods-programmers-believe-about-time-wisdom –

+0

Infatti. È una soluzione rapida. Preferirei essere quasi corretto che completamente sbagliato, per così dire. Ovviamente potresti usare uno scostamento DST basato sul fuso orario. Hai una bella proposta per questo? Mi piace il secondo link, ma non dà alcuna risposta; afferma solo che portiamo idee sbagliate. – frogge

+0

La risposta è nella mia risposta qui sotto. Usa DateFormatter, si prende cura dell'ora legale per te. –

2

questo codice magico fissi tutti i miei problemi con l'ora legale e del fuso orario. Scrivi se hai bisogno di aiuto.

NSDate sourceDate = date; 

NSTimeZone sourceTimeZone = new NSTimeZone ("UTC"); 
NSTimeZone destinationTimeZone = NSTimeZone.LocalTimeZone; 

int sourceGMTOffset = sourceTimeZone.SecondsFromGMT (sourceDate); 
int destinationGMTOffset = destinationTimeZone.SecondsFromGMT (sourceDate); 
int interval = destinationGMTOffset - sourceGMTOffset; 

var destinationDate = sourceDate.AddSeconds (interval); 

var dateTime = new DateTime(2001, 1, 1, 0, 0,0).AddSeconds(destinationDate.SecondsSinceReferenceDate); 

DescriptionLabel.Text = dateTime.ToString ("dd.MM.yyyy. HH:mm"); 
this.date = destinationDate; 
+1

Questo codice aggiunge complessità non necessaria. Se si desidera convertire il tempo nel proprio fuso orario locale, utilizzare semplicemente DateTime.ToLocalTime(). –

Problemi correlati