Comment obtenir le jour, le mois et l'année NSDate au format entier?

95

Je veux obtenir les composants jour, mois et année NSDatesous forme entière, c'est-à-dire si la date est 1/2/1988, alors je devrais obtenir 1, 2 et 1988 séparément sous forme d'entier. Comment puis-je faire cela sous iOS? J'ai trouvé la question similaire mais la méthode descriptionWithCalendarFormat: donne un avertissement et semble être obsolète maintenant.

Yogi
la source
Voir Convertir NSDate en un entier si un seul entier est nécessaire pour NSDate.
Suragch

Réponses:

223

Vous voilà,

NSDate *currentDate = [NSDate date];
NSCalendar* calendar = [NSCalendar currentCalendar];
NSDateComponents* components = [calendar components:NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay fromDate:currentDate]; // Get necessary date components

 [components month]; //gives you month
 [components day]; //gives you day
 [components year]; // gives you year

Vous pouvez utiliser NSDateComponents pour cela comme ci-dessus.

Veuillez visiter cette page pour plus de détails.

J'espère que ça aide.

Janak Nirmal
la source
1
+1 pour fournir le code de la bonne réponse. Mais vous devez mentionner que les informations proviennent de NSDateComponents, pas de NSDateFormatter.
Black Frog
@Black Excusez-vous pour cela. Mis à jour ma réponse.
Janak Nirmal
1
@ Janak Nirmal Écrivez un point précis, vous ne pouvez pas expliquer comment obtenir le format de chaîne pour le jour, le mois, l'année, un utilisateur ne peut pas comprendre.
annu
1
@JanakNirmal vous devez expliquer comment obtenir la valeur exacte.
annu
3
Pour éviter les avertissements d'obsolescence: NSDateComponents * components = [composants de calendrier: NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay fromDate: currentDate];
Rodrigo Pinto
17

Oui par l'utilisation de NSCalendar, cependant, je pense que cela fera votre travail.

NSDateComponents *components = [[NSCalendar currentCalendar] components:NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit fromDate:[NSDate date]];
NSInteger day = [components day];    
NSInteger month = [components month];
NSInteger year = [components year];
user755278
la source
13

Rapide

let components = NSCalendar.currentCalendar().components([.Day, .Month, .Year], fromDate: self)
let day = components.day
let month = components.month
let year = components.year

Pour plus de commodité, vous pouvez mettre ceci dans une NSDateextension et lui faire renvoyer un tuple:

extension NSDate: Comparable {

    var dayMonthYear: (Int, Int, Int) {
        let components = NSCalendar.currentCalendar().components([.Day, .Month, .Year], fromDate: self)
        return (components.day, components.month, components.year)
    }
}

Maintenant, vous devez écrire uniquement:

let (day, month, year) = date.dayMonthYear

Si vous vouliez par exemple n'obtenir que l'année, vous pouvez écrire:

let (_, _, year) = date.dayMonthYear
Ixx
la source
2
J'aime votre approche. Une suggestion est bien de changer la dénomination de paramètre (day: Int, month: Int, year: Int), de cette façon vous pouvez utiliser le résultat en utilisant date.dayMonthYear.day, date.dayMonthYear.month, date.dayMonthYear.year.
Paul Peelen
9

Vous pouvez utiliser NSDateComponents pour obtenir ceci,

NSCalendar *calendar = [NSCalendar autoupdatingCurrentCalendar];
NSDate *currDate = [NSDate date];
NSDateComponents *dComp = [calendar components:( NSYearCalendarUnit | NSMonthCalendarUnit |  NSDayCalendarUnit ) 
                                      fromDate:currDate];

int day = [dComp day];
int month = [dComp month];
int year = [dComp year];
Développeur mobile iOS Android
la source
8

Mettez-le dans une extension et vivez votre vie 🍸🏖

extension Date{
    var day:Int {return Calendar.current.component(.day, from:self)}
    var month:Int {return Calendar.current.component(.month, from:self)}
    var year:Int {return Calendar.current.component(.year, from:self)}
}
Date().day//22
Date().month//4
Date().year//2017

Swift 3.0 (C'est une itération des réponses précédentes, mais le résout pour tous vos futurs projets d'application)

éoniste
la source
7

Pour ceux qui se contentent de copier et coller directement depuis le Web, comme moi, il s'agit d'une petite mise à jour pour iOS 8

NSCalendar* calendar = [NSCalendar currentCalendar];
NSDateComponents* components = [calendar components:NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay fromDate:[NSDate date]];
[components day]; //Day
[components month];//Month
[components year];//Year

La différence est NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay NSMonthCalendarUnit | NSDayCalendarUnit | NSYearCalendarUnit | NSWeekdayCalendarUnitont été obsolètes

Jansen
la source
2

Vous pouvez essayer ceci .......

Mycal = [NSCalendar currentCalendar];
today = [NSDate date];
compA =[Mycal components:(NSMonthCalendarUnit | NSDayCalendarUnit | NSYearCalendarUnit | NSWeekdayCalendarUnit) fromDate:today];     
FirstDateofMonth=[today dateByAddingTimeInterval:([compA day]-1)*(-24*60*60)];

compA =[Mycal components:(NSMonthCalendarUnit | NSDayCalendarUnit | NSYearCalendarUnit | NSWeekdayCalendarUnit) fromDate:FirstDateofMonth];
today = FirstDateofMonth;
compA = [Mycal components:(NSMonthCalendarUnit | NSDayCalendarUnit | NSYearCalendarUnit | NSWeekdayCalendarUnit) fromDate:today];
[compA setMonth:([compA month])];
[self DrawMonthInPortraitView];
[compA retain];
Dinesh_
la source
1
NSDate *currentDate = [NSDate date];
NSCalendar* calendar = [NSCalendar currentCalendar];
NSDateComponents* components = [calendar components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit fromDate:currentDate]; // Get necessary date components

[components month]; //gives you month
[components day]; //gives you day
[components year]; // gives you year

NSString *temp=[NSString stringWithFormat:@"Months:%d Day:%d Year:%d",[components month],  [components day],[components year]];
NSLog(@"%@",temp);
annu
la source
1
let date = Date()
let calendar = Calendar.current

let year = calendar.component(.year, from: date)
let month = calendar.component(.month, from: date)
let day = calendar.component(.day, from: date)
print("hours = \(year):\(month):\(day)")
Oscarr
la source
1
Bien que ce code puisse répondre à la question, fournir un contexte supplémentaire concernant la raison et / ou la manière dont ce code répond à la question améliore sa valeur à long terme.
Donald Duck