Jak uzyskać dzień, miesiąc i rok NSDate w formacie liczb całkowitych?

95

Chcę otrzymać składniki dnia, miesiąca i roku NSDatew postaci liczby całkowitej, tj. Jeśli data to 1/2/1988, to powinienem otrzymać 1, 2 i 1988 osobno jako liczbę całkowitą. Jak mogę to zrobić w iOS? Znalazłem podobne pytanie, ale metoda descriptionWithCalendarFormat: daje ostrzeżenie i wydaje się być obecnie przestarzała.

Jog
źródło
Zobacz Konwertowanie NSDate na liczbę całkowitą, jeśli wymagana jest tylko jedna liczba całkowita NSDate.
Suragch

Odpowiedzi:

223

Tu masz,

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

Możesz użyć do tego NSDateComponents jak powyżej.

Odwiedź tę stronę, aby uzyskać szczegółowe informacje.

Mam nadzieję, że to pomoże.

Janak Nirmal
źródło
1
+1 za podanie kodu poprawnej odpowiedzi. Należy jednak wspomnieć, że informacje pochodzą z NSDateComponents, a nie z NSDateFormatter.
Black Frog
@Black Przeproś za to. Zaktualizowałem moją odpowiedź.
Janak Nirmal
1
@ Janak Nirmal Napisz konkretną kwestię, nie możesz wyjaśnić, jak uzyskać format ciągu dla dnia, miesiąca, roku, którego użytkownik nie może zrozumieć.
roczny
1
@JanakNirmal powinieneś wyjaśnić, jak uzyskać dokładną wartość.
annu
3
Aby uniknąć ostrzeżeń o wycofaniu: NSDateComponents * components = [składniki kalendarza: NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay fromDate: currentDate];
Rodrigo Pinto
17

Tak, ale dzięki NSCalendar, myślę, że to usprawni Twoją pracę.

NSDateComponents *components = [[NSCalendar currentCalendar] components:NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit fromDate:[NSDate date]];
NSInteger day = [components day];    
NSInteger month = [components month];
NSInteger year = [components year];
user755278
źródło
13

Szybki

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

Dla wygody możesz umieścić to w NSDaterozszerzeniu i sprawić, by zwróciło krotkę:

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

Teraz musisz tylko napisać:

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

Jeśli chciałeś np. Dostać tylko rok możesz napisać:

let (_, _, year) = date.dayMonthYear
Ixx
źródło
2
Podoba mi się twoje podejście. Propozycja jest jednak, aby zmienić parametr do nazewnictwa (day: Int, month: Int, year: Int), w ten sposób można wykorzystać wynik za pomocą date.dayMonthYear.day, date.dayMonthYear.month, date.dayMonthYear.year.
Paul Peelen,
9

Możesz użyć NSDateComponents, aby to uzyskać,

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];
Mobilny programista iOS Android
źródło
8

Umieść go w przedłużeniu i żyj swoim życiem 🍸🏖

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 (jest to iteracja poprzednich odpowiedzi, ale rozwiązuje problem dla wszystkich przyszłych projektów aplikacji)

eonista
źródło
7

Dla tych, którzy po prostu kopiują i wklejają bezpośrednio z sieci, jak ja, jest to mała aktualizacja dla 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

Różnica polega na tym, NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay NSMonthCalendarUnit | NSDayCalendarUnit | NSYearCalendarUnit | NSWeekdayCalendarUnitże zostały wycofane

Jansen
źródło
2

Możesz spróbować tego .......

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_
źródło
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
źródło
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
źródło
1
Chociaż ten kod może odpowiedzieć na pytanie, zapewnia dodatkowy kontekst dotyczący tego, dlaczego i / lub jak ten kod odpowiada, poprawia jego długoterminową wartość.
Kaczor Donald