2010-08-02 13 views
5

Ich benutze einen UIDatePicker und ich habe Probleme mit der Konvertierung dieser Daten in einen System.DateTime Wert in MonoTouch. Es gibt Probleme mit den Konvertierungen von NSDate zu DateTime, die ich größtenteils gelöst habe, aber jetzt sehe ich, dass Sie eine Stunde frei haben, wenn Sie ein Datum wählen, das NICHT in derselben Sommerzeit ist. Wenn ich beispielsweise ein Datum im Januar 2010 auswähle, habe ich ein Offset-Problem.Get Date Teile von einem NSDate-Wert

Was ich tun möchte ist, wenn ein Benutzer wählt ein Datum/Uhrzeit aus dem UIDatePicker ist, um die Jahr, Monat, Tag, Stunde und Minute Werte der NSDate und nur eine neue System.DateTime mit Diese Werte und ich werde immer sicher sein, einen Datumswert genau so zu erhalten, wie der Benutzer es im UIDatePicker sieht.

Wie kann ich einen NSDate-Wert in die verschiedenen Datumsteile zerlegen?

Vielen Dank.

+0

Wenn mir jemand helfen kann, NSDateComponents mit MonoTouch herauszufinden, würde ich mich freuen. Ich habe immer noch nicht herausgefunden, wie ich das machen soll. Beispielcode würde sehr geschätzt werden. Vielen Dank! – Neal

Antwort

2

Es scheint, dass dies mit einer Instanz von NSDateComponents durchgeführt werden kann. Folgendes wurde von Date Components and Calendar Units kopiert:

Um ein Datum in konstituierende Komponenten zu zersetzen, verwenden Sie die NSCalendar Methode Komponenten: VonDatum :. In Zusätzlich zu dem Datum selbst müssen Sie angeben, um die Komponenten im NSDateComponents Objekt zurückgegeben werden. Dazu verwendet das Verfahren eine Bitmaske, die aus Kalendereinheiten Konstanten besteht. Es ist nicht notwendig, weitere Komponenten als diejenigen in , die Sie interessieren, zu spezifizieren. Listing 3 zeigt, wie man den heutigen Tag berechnet und Wochentag.

Listing 3 Erste ein Datum Komponenten

NSDate *today = [NSDate date]; 
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 
NSDateComponents *weekdayComponents = [gregorian components:(NSDayCalendarUnit | NSWeekdayCalendarUnit) fromDate:today]; 
NSInteger day = [weekdayComponents day]; 
NSInteger weekday = [weekdayComponents weekday]; 
1
public static DateTime NSDateToDateTime(MonoTouch.Foundation.NSDate date) 
{ 
    return (new DateTime(2001,1,1,0,0,0)).AddSeconds(date.SecondsSinceReferenceDate); 
} 

public static MonoTouch.Foundation.NSDate DateTimeToNSDate(DateTime date) 
{ 
    return MonoTouch.Foundation.NSDate.FromTimeIntervalSinceReferenceDate((date-(new DateTime(2001,1,1,0,0,0))).TotalSeconds); 
} 

Ok, indem Sie den obigen Code verwenden Sie den NSDate in einem DateTime- drehen kann ein tun, wie Sie in der Regel auf .NET-Welt tun :) dann mit> DateTimeToNSDate Sie es zu einem NSDate

Hoffnung zurückkehren können, das hilft

Alex

4

Eine einfache Möglichkeit, die Sommerzeitprobleme loszuwerden, besteht darin, die Zeitzone auf GMT zu setzen. Dann wird die UIDatePicker Sommerzeit ignorieren:

_datePicker.TimeZone = NSTimeZone.FromAbbreviation("GMT"); 

Implizite Konvertierung von NSDate zu und von Datetime ist recht gut in Monotouch, aber man muss sich bewusst sein, dass NSDate immer eine UTC-Zeit und Datumzeit ist Standardsatz zu Datetimekind. Nicht angegeben (wenn aus der Datenbank gelesen) oder DateTimeKind.Locale (wenn mit DateTime.Today festgelegt). Der beste Weg, ohne komplizierte Zeitzonenberechnungen zu konvertieren ist, die richtige Datetimekind zu zwingen:

// Set date to the date picker (_date is a DateTime with time part 0:00:00): 
    _datePicker.Date = DateTime.SpecifyKind(_date, DateTimeKind.Utc); 

    // Get the date from the date picker: 
    _date = DateTime.SpecifyKind(_datePicker.Date, DateTimeKind.Unspecified); 

Das ist einfacher und zuverlässiger als der einzelne Tag, Monat und Jahr Werte zu bekommen.