Comment puis-je obtenir l'année / mois / jour d'un NSDate
objet, sans autre information? Je me rends compte que je pourrais probablement faire cela avec quelque chose de similaire à ceci:
NSCalendar *cal = [[NSCalendar alloc] init];
NSDateComponents *components = [cal components:0 fromDate:date];
int year = [components year];
int month = [components month];
int day = [components day];
Mais cela semble être beaucoup de tracas pour quelque chose d'aussi simple que d'obtenir une NSDate
année / mois / jour. N 'y a-t-il pas une autre solution?
objective-c
nsdate
nsdatecomponents
nscalendar
Richard J. Ross III
la source
la source
Réponses:
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,
NSDate
en 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 unNSDate
et 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 quiNSDate
devraient 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:Cela génère un
NSDateComponents
objet 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
NSCalendar
référence de classe . Plus d'informations surNSDateComponents
peuvent être trouvées dans laNSDateComponents
référence de classe .Pour référence, l'accès à des composants individuels depuis le
NSDateComponents
est assez simple:Vous devez juste être conscient:
NSDateComponents
ne 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 avecNSCalendarUnit
s).NSDateComponents
ne 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 exempleNSDateComponents
, vous devrez alimenter la méthode du générateurNSCalendar
avec leNSCalendarUnitEra
drapeau.la source
NSCalendar
La+currentCalendar
méthode de retourne le calendrier système, et donc si le téléphone de l'utilisateur est réglé sur le mode japonais ou thaïlandais, vous obtiendrez une année différente. Si vous souhaitez forcer un système de calendrier spécifique, créez un calendrier et initialisez-le avec les paramètres régionaux appropriés. Par exemple, pour forcer un calendrier grégorien, vous voudrez utiliser ce qui suit:[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]
Vous pouvez obtenir un composant distinct d'une NSDate à l'aide de NSDateFormatter:
Si vous souhaitez obtenir le numéro du mois au lieu de l'abréviation, utilisez "MM". Si vous souhaitez obtenir des entiers, utilisez
[myDayString intValue];
la source
Juste pour reformuler l'excellent code d'Itai (et qui fonctionne!), Voici à quoi ressemblerait un exemple de classe d'aide, pour renvoyer la valeur de l' année d'une variable NSDate donnée.
Comme vous pouvez le voir, il est assez facile de modifier ce code pour obtenir le mois ou le jour.
(Je ne peux pas croire que nous devions écrire nos propres fonctions de date iOS de base comme ça, en 2013 ...)
Autre chose: n'utilisez jamais <et> pour comparer deux valeurs NSDate.
XCode acceptera volontiers ce code (sans erreur ni avertissement), mais ses résultats sont une loterie. Vous devez utiliser la fonction "comparer" pour comparer les NSDates:
la source
Dans Swift 2.0:
la source
J'écris cette réponse parce que c'est la seule approche qui ne vous redonne pas les options des
NSDateComponent
variables et / ou ne force pas le déballage de ces variables (également pour Swift 3).Swift 3
Swift 2
Version amusante bonus Swift 3
la source
Nouveau dans iOS 8
ObjC
Rapide
la source
Si vous ciblez iOS 8+, vous pouvez utiliser les nouvelles
NSCalendar
méthodes pratiques pour y parvenir dans un format plus concis.Créez d'abord un
NSCalendar
et utilisez ce quiNSDate
est nécessaire.Vous pouvez extraire les composants individuellement via
component:fromDate:
Ou, encore plus succinctement, utilisez des
NSInteger
pointeurs viagetEra:year:month:day:fromDate:
Pour plus d'informations et d'exemples, consultez NSDate Manipulation Made Easy dans iOS 8 . Avertissement, j'ai écrit le message.
la source
Depuis iOS 8.0 (et OS X 10), vous pouvez utiliser la méthode des composants pour simplifier l'obtention d'un composant de date unique comme ceci:
Cela devrait simplifier les choses et, espérons-le, cela sera mis en œuvre efficacement.
la source
Si vous souhaitez obtenir les NSDateComponents individuels de NSDate, vous aurez certainement besoin de la solution suggérée par Itai Ferber. Mais si vous souhaitez passer de NSDate directement à une NSString, vous pouvez utiliser NSDateFormatter .
la source
la source
Voici la solution dans Swift:
la source
Essaye ça . . .
Extrait de code:
Il donne l'année en cours, le mois, la date
la source
Essayez ce qui suit:
la source
Swift 2.x
Vous pouvez l'utiliser comme
Production
la source
Rapide
Un moyen plus simple d'obtenir tous les éléments de la date sous forme de chaîne facultative.
la source
je fais de cette façon ....
la source
Pour obtenir une chaîne lisible par l'homme (jour, mois, année), vous pouvez faire:
la source