Come ottenere NSDate giorno, mese e anno in formato intero?


95

Voglio ottenere i componenti del giorno, del mese e dell'anno NSDatein forma intera, cioè se la data è 1/2/1988 allora dovrei ottenere 1, 2 e 1988 separatamente come numero intero. Come posso farlo in iOS? Ho trovato la domanda simile ma il metodo descriptionWithCalendarFormat: dà un avviso e sembra essere ormai deprecato.


Vedere Convertire NSDate in un numero intero se è necessario un solo numero intero NSDate.
Suragch

Risposte:


223

Ecco qui,

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

Puoi usare NSDateComponents per quello come sopra.

Visita questa pagina per i dettagli.

Spero che sia d'aiuto.


1
+1 per aver fornito il codice per la risposta corretta. Ma dovresti menzionare che le informazioni provengono da NSDateComponents, non da NSDateFormatter.
Black Frog

@Black Chiedo scusa per questo. Ho aggiornato la mia risposta.
Janak Nirmal

1
@ Janak Nirmal Scrivi un punto specifico che non potresti spiegare come ottenere il formato della stringa per giorno, mese, anno, un utente non poteva capire.
annu

1
@JanakNirmal dovresti spiegarlo come ottenere il valore esatto.
annu

3
Per evitare avvisi di deprecazione: NSDateComponents * components = [componenti del calendario: NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay fromDate: currentDate];
Rodrigo Pinto

17

Sì, grazie all'uso di NSCalendar, penso che questo farà il tuo lavoro.

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

13

Swift

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

Per comodità puoi metterlo in NSDateun'estensione e fargli restituire una tupla:

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)
    }
}

Ora devi scrivere solo:

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

Se ad esempio vuoi ottenere solo l'anno puoi scrivere:

let (_, _, year) = date.dayMonthYear

2
Mi piace il tuo approccio. Un suggerimento però è quello di cambiare il parametro di denominazione per (day: Int, month: Int, year: Int), in questo modo è possibile utilizzare il risultato utilizzando date.dayMonthYear.day, date.dayMonthYear.month, date.dayMonthYear.year.
Paul Peelen

9

Puoi usare NSDateComponents per ottenerlo,

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

8

Mettilo in un'estensione e vivi la tua vita 🍸🏖

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 (è un'iterazione delle risposte precedenti, ma lo risolve per tutti i tuoi futuri progetti di app)


7

Per chi si limita a copiare e incollare direttamente dal web, come me, questo è un piccolo aggiornamento per 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 differenza è che NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay NSMonthCalendarUnit | NSDayCalendarUnit | NSYearCalendarUnit | NSWeekdayCalendarUnitsono stati deprecati


2

Puoi provare questo .......

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

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

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)")

1
Sebbene questo codice possa rispondere alla domanda, fornire un contesto aggiuntivo sul perché e / o come questo codice risponde alla domanda ne migliora il valore a lungo termine.
Paperino
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.