Parce que c'est apparemment ma réponse la plus populaire, je vais essayer de la modifier pour contenir un peu plus d'informations.
Malgré son nom, NSDateen soi, il marque simplement un point dans le temps de la machine, pas une date. Il n'y a pas de corrélation entre le moment spécifié par un NSDateet un an, un mois ou un jour. Pour cela, vous devez vous référer à un calendrier. Tout moment donné renverra des informations de date différentes en fonction du calendrier que vous regardez (les dates ne sont pas les mêmes dans les calendriers grégorien et juif, par exemple), et bien que le calendrier grégorien soit le calendrier le plus utilisé dans le monde - je suppose - nous sommes un peu biaisés qui NSDatedevraient toujours l'utiliser. NSDate, heureusement, est beaucoup plus bipartite.
Obtenir la date et l'heure devra passer NSCalendar, comme vous l'avez mentionné, mais il existe un moyen plus simple de le faire:
NSDateComponents *components = [[NSCalendar currentCalendar] components:NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear fromDate:[NSDate date]];
Cela génère un NSDateComponentsobjet contenant le jour, le mois et l'année à partir du calendrier système actuel pour le jour en cours. ( Remarque: ce n'est pas nécessairement le calendrier actuel spécifié par l'utilisateur , juste celui par défaut du système.)
Bien sûr, si vous utilisez un calendrier ou une date différents, vous pouvez facilement changer cela. Une liste des calendriers et des unités de calendrier disponibles se trouve dans la NSCalendarréférence de classe . Plus d'informations sur NSDateComponentspeuvent être trouvées dans la NSDateComponentsréférence de classe .
Pour référence, l'accès à des composants individuels depuis le NSDateComponentsest assez simple:
NSInteger day = [components day];
NSInteger month = [components month];
NSInteger year = [components year];
Vous devez juste être conscient: NSDateComponentsne contiendra pas d'informations valides pour les champs que vous demandez, sauf si vous les avez générés avec ces informations valides (c'est- NSCalendarà- dire demander à fournir ces informations avec NSCalendarUnits). NSDateComponentsne contiennent aucune information de référence en soi - ce ne sont que de simples structures qui contiennent des numéros auxquels vous pouvez accéder. Si vous voulez également sortir une ère, par exemple NSDateComponents, vous devrez alimenter la méthode du générateur NSCalendaravec le NSCalendarUnitEradrapeau.