Poiché questa è apparentemente la mia risposta più popolare, proverò a modificarla per contenere un po 'più di informazioni.
Nonostante il suo nome, NSDatedi per sé segna semplicemente un punto nel tempo della macchina, non una data. Non esiste alcuna correlazione tra il punto temporale specificato da un NSDatee 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 NSDatedovrebbe 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 NSDateComponentsoggetto 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 NSCalendarriferimento di classe . Ulteriori informazioni su NSDateComponentssono disponibili nel NSDateComponentsriferimento 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: NSDateComponentsnon conterrà informazioni valide per tutti i campi che richiedi a meno che tu non li abbia generati con quelle informazioni valide (cioè la richiesta NSCalendardi fornire tali informazioni con NSCalendarUnit). NSDateComponentsnon 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 NSCalendarcon la NSCalendarUnitErabandiera.