NSDate год/месяц/день
как я могу получить год / месяц / день
17 ответов:
поскольку это, по-видимому, мой самый популярный ответ, я попытаюсь отредактировать его, чтобы содержать немного больше информации.
несмотря на свое название,
NSDate
само по себе просто отмечает точку в машинном времени, а не дату. Нет никакой корреляции между моментом времени, указаннымNSDate
и год, месяц или день. Для этого вам нужно обратиться к календарю. Любой данный момент времени вернет различную информацию о дате на основе того, какой календарь вы смотрите (даты не то же самое и в григорианском и Еврейском календарях, например), и хотя Григорианский календарь является наиболее широко используемым календарем в мире - я предполагаю - мы немного предвзяты, чтоNSDate
должен всегда использовать его.NSDate
, к счастью, гораздо более двухпартийным.
получение даты и времени придется пройти через
NSCalendar
, как вы упомянули, но есть более простой способ сделать это:NSDateComponents *components = [[NSCalendar currentCalendar] components:NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear fromDate:[NSDate date]];
создает
NSDateComponents
объект, содержащий день, месяц и год из текущего системного календаря на текущий день. (Примечание: это не обязательно ток user-specified календарь, только по умолчанию системный.)конечно, если вы используете другой календарь или дата, вы можете легко изменить это. Список доступных календарей и календарных блоков можно найти в файле
NSCalendar
Ссылка На Класс. Более подробная информация оNSDateComponents
можно найти вNSDateComponents
Ссылка На Класс.
Для справки, доступ к отдельным компонентам от
NSDateComponents
достаточно просто:NSInteger day = [components day]; NSInteger month = [components month]; NSInteger year = [components year];
вы просто должны помнить:
NSDateComponents
не будет содержать действительную информацию для любых полей, которые вы просите, если вы не создали их с этой действительной информацией (т. е. запросNSCalendar
чтобы предоставить эту информацию сNSCalendarUnit
s).NSDateComponents
не содержат никакой справочной информации сами по себе - это просто простые структуры, которые содержат числа для вас доступе. Если вы хотите также получить эру, например, изNSDateComponents
, вы должны будете кормить метод генератора отNSCalendar
СNSCalendarUnitEra
флаг.
вы можете получить отдельный компонент NSDate с помощью 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]];
Если вы хотите получить номер месяца вместо аббревиатуры, используйте "мм". Если вы хотите получить целые числа, используйте
[myDayString intValue];
просто перефразировать Итай отлично (и работает!) код, вот как будет выглядеть пример вспомогательного класса, чтобы вернуть год значение заданной переменной NSDate.
Как видите, достаточно легко изменить этот код, чтобы получить месяц или день.
+(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; }
(Я не могу поверить, что мы должны написать наши собственные основные функции даты iOS, как это, в 2013 году...)
еще одна вещь: никогда не используйте для сравнения двух NSDate ценности.
XCode с радостью примет такой код (без каких-либо ошибок или предупреждений), но его результаты являются лотереей. Ты должны используйте функцию "сравнить" для сравнения NSDates:
if ([date1 compare:date2] == NSOrderedDescending) { // date1 is greater than date2 }
В Swift 2.0:
let date = NSDate() let calendar = NSCalendar(identifier: NSCalendarIdentifierGregorian)! let components = calendar.components([.Month, .Day], fromDate: date) let (month, day) = (components.month, components.day)
Я пишу этот ответ, потому что это единственный подход, который не дает вам варианты вернулась из
NSDateComponent
переменные и / или принудительное разворачивание этих переменных (также для Swift 3).Swift 3
let date = Date() let cal = Calendar.current let year = cal.component(.year, from: date) let month = cal.component(.month, from: date) let day = cal.component(.day, from: date)
Swift 2
let date = NSDate() let cal = NSCalendar.currentCalendar() let year = cal.component(.Year, fromDate: date) let month = cal.component(.Month, fromDate: date) let day = cal.component(.Day, fromDate: date)
бонус Swift 3 fun version
let date = Date() let component = { (unit) in return Calendar.current().component(unit, from: date) } let year = component(.year) let month = component(.month) let day = component(.day)
новое в iOS 8
ObjC
NSDate *date = [NSDate date]; NSInteger era, year, month, day; [[NSCalendar currentCalendar] getEra:&era year:&year month:&month day:&day fromDate:date];
Свифт
let date = NSDate.init() var era = 0, year = 0, month = 0, day = 0 NSCalendar.currentCalendar().getEra(&era, year:&year, month:&month, day:&day, fromDate: date)
если вы нацелены на iOS 8+ , вы можете использовать новый
NSCalendar
удобные методы для достижения этого в более кратком формате.создать
NSCalendar
и использовать все это.NSCalendar *calendar = [NSCalendar currentCalendar]; NSDate *date = [NSDate date];
вы можете извлекать компоненты по отдельности через
component:fromDate:
NSInteger year = [calendar component:NSCalendarUnitYear fromDate:date]; NSInteger month = [calendar component:NSCalendarUnitMonth fromDate:date]; NSInteger day = [calendar component:NSCalendarUnitDay fromDate:date];
или, еще более лаконично, используйте
NSInteger
указатели черезgetEra:year:month:day:fromDate:
NSInteger year, month, day; [calendar getEra:nil year:&year month:&month day:&day fromDate:date];
для получения дополнительной информации и примеров, проверить Nsdate манипуляции легко в iOS 8. Отказ от ответственности, я написал сообщение.
начиная с iOS 8.0 (и OS X 10) вы можете использовать компонент метод для упрощения получения одного компонента даты, например:
int year = [[NSCalendar currentCalendar] component:NSCalendarUnitYear fromDate:[NSDate date]];
должно сделать вещи проще и, надеюсь, это будет реализовано эффективно.
Если вы хотите получить отдельные NSDateComponents от NSDate, вам определенно понадобится решение, предложенное Итаем Фербером. Но если вы хотите чтобы перейти от NSDate непосредственно к NSString, вы можете использовать NSDateFormatter.
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);
вот решение в Swift:
let todayDate = NSDate() let calendar = NSCalendar(identifier: NSCalendarIdentifierGregorian)! // Use a mask to extract the required components. Extract only the required components, since it'll be expensive to compute all available values. let components = calendar.components(.CalendarUnitYear | .CalendarUnitMonth | .CalendarUnitDay, fromDate: todayDate) var (year, month, date) = (components.year, components.month, components.day)
попробуйте следующее:
NSString *birthday = @"06/15/1977"; NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; [formatter setDateFormat:@"MM/dd/yyyy"]; NSDate *date = [formatter dateFromString:birthday]; if(date!=nil) { NSInteger age = [date timeIntervalSinceNow]/31556926; NSDateComponents *components = [[NSCalendar currentCalendar] components:NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear fromDate:date]; NSInteger day = [components day]; NSInteger month = [components month]; NSInteger year = [components year]; NSLog(@"Day:%d Month:%d Year:%d Age:%d",day,month,year,age); } [formatter release];
Swift 2.x
extension NSDate { func currentDateInDayMonthYear() -> String { let dateFormatter = NSDateFormatter() dateFormatter.dateFormat = "d LLLL yyyy" return dateFormatter.stringFromDate(self) } }
вы можете использовать его как
NSDate().currentDateInDayMonthYear()
выход
6 March 2016
попробуйте это . . .
фрагмент кода:
NSDateComponents *components = [[NSCalendar currentCalendar] components:NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear fromDate:[NSDate date]]; int year = [components year]; int month = [components month]; int day = [components day];
Он дает текущий год, месяц, дату
Я делаю таким образом ....
NSDate * mydate = [NSDate date]; NSCalendar * mycalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; NSCalendarUnit units = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay; NSDateComponents * myComponents = [mycalendar components:units fromDate:mydate]; NSLog(@"%d-%d-%d",myComponents.day,myComponents.month,myComponents.year);
чтобы получить читаемую человеком строку (день, месяц, год), вы можете сделать:
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateStyle:NSDateFormatterMediumStyle]; NSString *string = [dateFormatter stringFromDate:dateEndDate];
Свифт
более простой способ получить любые элементы даты в качестве необязательной строки.
extension Date { // Year var currentYear: String? { return getDateComponent(dateFormat: "yy") //return getDateComponent(dateFormat: "yyyy") } // Month var currentMonth: String? { return getDateComponent(dateFormat: "M") //return getDateComponent(dateFormat: "MM") //return getDateComponent(dateFormat: "MMM") //return getDateComponent(dateFormat: "MMMM") } // Day var currentDay: String? { return getDateComponent(dateFormat: "dd") //return getDateComponent(dateFormat: "d") } func getDateComponent(dateFormat: String) -> String? { let format = DateFormatter() format.dateFormat = dateFormat return format.string(from: self) } } let today = Date() print("Current Year - \(today.currentYear)") // result Current Year - Optional("2017") print("Current Month - \(today.currentMonth)") // result Current Month - Optional("7") print("Current Day - \(today.currentDay)") // result Current Day - Optional("10")