Як отримати день, місяць та рік NSDate у цілочисельному форматі?


95

Я хочу отримати компоненти дня, місяця та року NSDateу цілочисельній формі, тобто якщо дата 1/2/1988, то я повинен отримати 1, 2 та 1988 окремо як ціле число. Як я можу це зробити в iOS? Я знайшов подібне запитання, але метод descriptionWithCalendarFormat: дає попередження і, здається, на сьогодні застарілий.


Див. Перетворення NSDate у ціле число, якщо для цього потрібно лише одне ціле число NSDate.
Сурач

Відповіді:


223

Ось ти,

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

Ви можете використовувати NSDateComponents для цього, як зазначено вище.

Будь ласка, відвідайте цю сторінку для деталей.

Сподіваюся, це допомагає.


1
+1 за надання коду правильної відповіді. Але слід зазначити, що інформація надходить від NSDateComponents, а не від NSDateFormatter.
Чорна жаба

@Black Вибачте за це. Оновлено мою відповідь.
Янак Нірмал

1
@ Janak Nirmal Напишіть конкретне, ви не можете пояснити, як отримати формат рядка для дня, місяця, року, який користувач не може зрозуміти.
щорічно

1
@JanakNirmal ви повинні пояснити, як отримати точне значення.
щорічно

3
Щоб уникнути попередження про застарілість: NSDateComponents * components = [компоненти календаря: NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay fromDate: currentDate];
Родріго Пінто

17

Так, завдяки використанню NSCalendar, я думаю, це зробить вашу роботу.

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

13

Швидкий

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

Для зручності ви можете помістити це в NSDateрозширення і змусити його повернути кортеж:

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

Тепер вам потрібно написати лише:

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

Якщо ви хотіли, наприклад, отримати лише рік, ви можете написати:

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

2
Мені подобається ваш підхід. Пропозиція , хоча це змінити параметр іменування (day: Int, month: Int, year: Int), таким чином , ви можете використовувати результат, використовуючи date.dayMonthYear.day, date.dayMonthYear.month, date.dayMonthYear.year.
Пол Пілен

9

Ви можете використовувати NSDateComponents, щоб отримати це,

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

Покладіть його в продовження і живіть своїм життям 🍸🏖

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 (це ітерація попередніх відповідей, але вирішує її для всіх ваших майбутніх проектів додатків)


7

Для тих, хто просто копіює та вставляє безпосередньо з Інтернету, як я, це невелике оновлення для 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

Різниця NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay NSMonthCalendarUnit | NSDayCalendarUnit | NSYearCalendarUnit | NSWeekdayCalendarUnitзастаріла


2

Ви можете спробувати це .......

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
Хоча цей код може відповісти на питання, надаючи додатковий контекст щодо того, чому та / або як цей код відповідає на питання, покращує його довгострокове значення.
Дональд Дак
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.