2013-09-06 20 views
8

Ich habe ein Problem mit dem Monotouch UIDatePicker 1 Stunde zurück. Ich denke, das hat mit Zeitzonen oder etwas ähnlichem zu tun. Ich habe versucht, die TimeZone und das Gebietsschema meines UIDatePicker explizit einzustellen, aber das scheint nicht zu helfen.Zeitzone Problem mit UIDatePicker Datum: 1 Stunde falsch

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

Im Value Handler die folgende Zeile ein Wert 1 Stunde kehrt früher als die in der Benutzeroberfläche ausgewählt Zeit:

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

Im Value Handler ich doppelt so die Locale und Time-Zone überprüft haben ist das Gleiche wie das, was eingestellt wurde. Die TimeZone ist Europa/Dublin und Locale en_US. Diese Informationen abgerufen von:

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

Gibt es einen weiteren Schritt I fehlt bin?

Danke!

+0

Ist es möglich, dass die Sommerzeit in Kraft ist? Dies kann manchmal Stundenunterschiede verursachen, ähnlich wie Sie es zu erleben scheinen. –

Antwort

9

Das von DatePicker zurückgegebene Datum ist im UTC-Format. Es gibt verschiedene Methoden, UTC in lokale Zeit zu konvertieren. Als this antwortet, dass ToLocalTime der beste ist.

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

Ich denke, das ist die richtige Antwort. Im ursprünglichen Code hat das OP "DateTimeKind.Local" anstelle von "DateTimeKind.Utc" angegeben. Da ein 'NSDate' für UTC steht, aber die Konvertierung nicht '.Kind' definiert, müssen Sie dies tun. –

+0

Aber datePicker.Date ist ein NSDate und der erste Parameter der Methode DateTime.SpecifyKind ist ein DateTime ... – leoneboaventura

3

Nach var date = DateTime ..., fügen Sie die folgenden Schritte aus:

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

Die Sommerzeit wird nicht immer um eine Stunde angepasst. http://www.timeanddate.com/time/dst/ http://infiniteundo.com/post/25509354022/more-falsehoods-programmers-believe-about-time-wisdom –

+0

In der Tat. Es ist eine schnelle Lösung. Ich wäre lieber fast richtig, als völlig falsch, sozusagen. Sie könnten natürlich einen DST-Offset basierend auf der Zeitzone verwenden. Haben Sie einen schönen Vorschlag dafür? Ich mag den zweiten Link, aber er gibt keine Antworten; sagt nur, dass wir Missverständnisse tragen. – frogge

+0

Die Antwort ist in meiner Antwort unten. Verwenden Sie DateFormatter, es kümmert sich um DST für Sie. –

2

Dieser magische Code fixiert alle meine Probleme mit der Sommer und Zeitzonen. Schreiben Sie, wenn Sie Hilfe benötigen.

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

Dieser Code fügt unnötige Komplexität hinzu. Wenn Sie die Zeit in Ihre lokale Zeitzone umwandeln möchten, verwenden Sie einfach DateTime.ToLocalTime(). –