Poiché questa è apparentemente la mia risposta più popolare, proverò a modificarla per contenere un po 'più di informazioni.
Nonostante il suo nome, NSDate
di per sé segna semplicemente un punto nel tempo della macchina, non una data. Non esiste alcuna correlazione tra il punto temporale specificato da un NSDate
e un anno, mese o giorno. Per questo, devi fare riferimento a un calendario. Ogni dato momento restituirà informazioni sulla data diverse in base al calendario che stai visualizzando (le date non sono le stesse nei calendari gregoriano ed ebraico, ad esempio) e mentre il calendario gregoriano è il calendario più utilizzato nella mondo - presumo - siamo un po 'di parte che NSDate
dovrebbe sempre usarlo. NSDate
, per fortuna, è molto più bipartisan.
Ottenere la data e l'ora dovrà passare NSCalendar
, come hai già detto, ma c'è un modo più semplice per farlo:
NSDateComponents *components = [[NSCalendar currentCalendar] components:NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear fromDate:[NSDate date]];
Ciò genera un NSDateComponents
oggetto contenente il giorno, il mese e l'anno dal calendario di sistema corrente per il giorno corrente. ( Nota: questo non è necessariamente l'attuale calendario specificato dall'utente , solo quello di sistema predefinito.)
Naturalmente, se stai utilizzando un calendario o una data diversi, puoi facilmente cambiarlo. Un elenco di calendari e unità di calendario disponibili è disponibile nel NSCalendar
riferimento di classe . Ulteriori informazioni su NSDateComponents
sono disponibili nel NSDateComponents
riferimento di classe .
Per riferimento, accedere ai singoli componenti da NSDateComponents
è piuttosto semplice:
NSInteger day = [components day];
NSInteger month = [components month];
NSInteger year = [components year];
Devi solo essere consapevole: NSDateComponents
non conterrà informazioni valide per tutti i campi che richiedi a meno che tu non li abbia generati con quelle informazioni valide (cioè la richiesta NSCalendar
di fornire tali informazioni con NSCalendarUnit
). NSDateComponents
non contengono informazioni di riferimento in sé e per sé - sono solo semplici strutture che contengono numeri a cui puoi accedere. Se vuoi ottenere anche un'era, per esempio NSDateComponents
, dovrai alimentare il metodo del generatore NSCalendar
con la NSCalendarUnitEra
bandiera.