2010-08-02 16 views
5

Utilizzo un UIDatePicker e sto riscontrando problemi con la conversione di questi dati in un valore System.DateTime in MonoTouch. Ci sono problemi con le conversioni da NSDate a DateTime, che ho risolto per lo più, ma ora vedo che se si sceglie una data che NON è nello stesso periodo di ora legale, si è a un'ora di riposo. Ad esempio, se scelgo una data nel gennaio 2010 avrò un problema di offset.Ottenere data Parti da un valore NSDate

Quello che mi piacerebbe fare è quando un utente seleziona una data/ora da UIDatePicker per ottenere i valori di anno, mese, giorno, ora e minuto di NSDate e basta creare un nuovo System.DateTime con questi valori e avrò sempre la certezza di ottenere un valore di data esattamente come l'utente lo vede nell'UIDatePicker.

Come si può suddividere un valore NSDate nelle varie parti della data?

Grazie.

+0

Se qualcuno può aiutarmi a capire NSDateComponents utilizzando MonoTouch, lo apprezzerei. Non ho ancora capito come farlo. Il codice di esempio sarebbe molto apprezzato. Grazie! – Neal

risposta

2

Sembra che questo può essere fatto utilizzando un'istanza di NSDateComponents. Il seguente è stato copiato da Date Components and Calendar Units:

a decomporsi in una data costituenti componenti, si utilizzano i componenti metodo NSCalendar : fromdate :. In oltre alla data stessa, è necessario per specificare i componenti da restituiti nell'oggetto NSDateComponents . A tale scopo, il metodo utilizza una maschera di bit composta da costanti di Unità di calendario . Non è necessario specificare più componenti di quelli in che ti interessa. L'elenco 3 mostra come calcolare il giorno di oggi e il giorno della settimana .

Listing 3 Come componenti di una data

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 utilizzando il codice di cui sopra è possibile ruotare la NSDate in un DateTime un fare come si fa normalmente su .Net mondo :) poi con> DateTimeToNSDate è possibile tornare a una NSDate

Spero che questo aiuti

Alex

4

Un modo semplice per sbarazzarsi dei problemi di ora legale è impostare il fuso orario su GMT. Poi l'UIDatePicker ignorerà l'ora legale:

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

implicita conversione di NSDate da e per DateTime è abbastanza buona in MonoTouch, ma si deve essere consapevoli del fatto che NSDate è sempre un tempo UTC e DateTime è impostato di default per DateTimeKind. Non specificato (quando letto dal database) o DateTimeKind.Locale (se impostato con DateTime.Today). Il modo migliore per convertire, senza calcoli di fuso orario complicati è quello di forzare il diritto DateTimeKind:

// 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); 

Questo è più facile e più affidabile di ottenere il singolo giorno, mese e anno valori.