289 votes

NSDate get an/mois/jour

Comment puis-je obtenir l’année/mois/jour d’un `` objet, ne donné aucune autre information ? Je me rends compte que je pourrais probablement le faire avec quelque chose de semblable à ceci :

Mais cela semble être beaucoup de tracas pour quelque chose d’aussi simple que d’obtenir une `` de l’année/mois/jour. Y a-t-il une autre solution ?

612voto

Itai Ferber Points 11517

Parce que c'est apparemment ma réponse, je vais essayer de le modifier pour contenir un peu plus d'informations.

En dépit de son nom, NSDate dans et de lui-même tout simplement marque un point dans une machine de temps, pas une date. Il n'y a pas de corrélation entre le point dans le temps spécifié par un NSDate et une année, le mois ou le jour. Pour cela, vous devez vous référer à un calendrier. Un moment donné dans le temps sera de retour différente de la date de l'information basée sur ce calendrier, vous êtes en train de regarder (les dates ne sont pas les mêmes dans les deux le calendrier Grégorien et le Juif calendriers, par exemple), et alors que le calendrier Grégorien est le plus largement utilisé des civils dans le monde - je suppose - nous sommes un peu biaisé qu' NSDate devez toujours l'utiliser. NSDate, heureusement, est bien plus bipartisan.


Obtenir la date et l'heure va passer par NSCalendar, comme vous l'avez mentionné, mais il y a un moyen plus simple de le faire:

NSDateComponents *components = [[NSCalendar currentCalendar] components:NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear fromDate:[NSDate date]];

Qui génère une NSDateComponents objet contenant le jour, le mois et l'année de l'actuel système de calendrier pour la journée en cours. (Note: ce n'est pas nécessairement le courant spécifié par l'utilisateur de calendrier, tout le système par défaut.)

Bien sûr, si vous utilisez un autre calendrier ou une date, vous pouvez facilement changer cela. Une liste de calendriers et agenda des unités peut être trouvé dans l' NSCalendar Classe de Référence. Plus d'informations sur l' NSDateComponents peut être trouvé dans l' NSDateComponents Classe de Référence.


Pour référence, l'accès aux différents composants de l' NSDateComponents est plutôt facile:

NSInteger day = [components day];
NSInteger month = [components month];
NSInteger year = [components year];

Vous avez juste à être conscient: NSDateComponents ne contiennent pas des informations valables pour tous les champs que vous demandez, à moins que vous avez généré avec des informations valides (c'est à dire demande NSCalendar fournir cette information avec d' NSCalendarUnits). NSDateComponents ne contiennent aucune référence à des informations dans et d'eux - mêmes, ils sont de simples structures qui détiennent les numéros pour accéder à. Si vous souhaitez également obtenir une époque, par exemple, NSDateComponents, vous aurez pour alimenter le générateur de méthode de NSCalendar avec l' NSCalendarUnitEra drapeau.

50voto

skocko76 Points 289

Vous pouvez obtenir le composant séparé d'un NSDate en utilisant NSDateFormatter:

 NSDateFormatter *df = [[NSDateFormatter alloc] init];

[df setDateFormat:@"dd"];
myDayString = [df stringFromDate:[NSDate date]];

[df setDateFormat:@"MMM"];
myMonthString = [df stringFromDate:[NSDate date]];

[df setDateFormat:@"yy"];
myYearString = [df stringFromDate:[NSDate date]];
 

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];

17voto

Mike Gledhill Points 2105

Juste pour reformuler Itai est excellent (et de travail!) code, voici ce qu'un échantillon de la classe helper ressemblerait, pour revenir l' année de la valeur d'une donnée NSDate variable.

Comme vous pouvez le voir, il est assez facile de modifier ce code pour obtenir le mois ou le jour.

+(int)getYear:(NSDate*)date
{
    NSDateComponents *components = [[NSCalendar currentCalendar] components:NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit fromDate:date];

    int year = [components year];
    int month = [components month];
    int day = [components day];

    return year;
}

(Je ne peux pas croire que nous allons avoir à écrire notre propre base iOS les fonctions de date comme ceci, en 2013...)

Une autre chose: ne jamais utiliser les touches < et > pour comparer deux NSDate valeurs.

XCode sera heureux d'accepter ce type de code (sans les erreurs ou les avertissements), mais ses résultats sont une loterie. Vous devez utiliser la fonction "comparer" en fonction de comparaison de NSDates:

if ([date1 compare:date2] == NSOrderedDescending) {
    // date1 is greater than date2        
}

2voto

gumbo Points 21

Si vous souhaitez obtenir l'individu NSDateComponents de NSDate, vous aurez certainement besoin de la solution proposée par Itai Ferber. Mais si vous voulez passer de NSDate directement à NSString, vous pouvez utiliser NSDateFormatter .

2voto

Linh Nguyen Points 87
    NSDate *currDate = [NSDate date];
    NSCalendar*       calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    NSDateComponents* components = [calendar components:NSDayCalendarUnit|NSMonthCalendarUnit|NSYearCalendarUnit fromDate:currDate];
    NSInteger         day = [components day];
    NSInteger         month = [components month];
    NSInteger         year = [components year];
    NSLog(@"%d/%d/%d", day, month, year);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X