NSDate получить год / месяц / день
Как я могу получить год / месяц / день NSDate
объект, не дал никакой другой информации? Я понимаю, что я мог бы сделать это с чем-то похожим на это:
NSCalendar *cal = [[NSCalendar alloc] init];
NSDateComponents *components = [cal components:0 fromDate:date];
int year = [components year];
int month = [components month];
int day = [components day];
Но это, кажется, много хлопот для чего-то столь же простого, как получение NSDate
год / месяц / день. Есть ли другое решение?
17 ответов
Поскольку это, по-видимому, мой самый популярный ответ, я постараюсь отредактировать его, чтобы он содержал немного больше информации.
Несмотря на свое название, NSDate
само по себе просто отмечает точку в машинном времени, а не дату. Там нет никакой корреляции между моментом времени, указанным NSDate
и год, месяц или день. Для этого вам нужно обратиться к календарю. Любой данный момент времени будет возвращать различную информацию о дате в зависимости от того, какой календарь вы просматриваете (например, даты не совпадают в григорианском и еврейском календарях), а григорианский календарь является наиболее широко используемым календарем в мир - я предполагаю - мы немного предвзяты, что NSDate
всегда должен использовать это. NSDate
К счастью, это гораздо более двухпартийный.
Получение даты и времени должно пройти через NSCalendar
, как вы упомянули, но есть более простой способ сделать это:
NSDateComponents *components = [[NSCalendar currentCalendar] components:NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear fromDate:[NSDate date]];
Это создает NSDateComponents
объект, содержащий день, месяц и год из текущего системного календаря на текущий день. (Примечание: это не обязательно текущий пользовательский календарь, а только системный календарь по умолчанию.)
Конечно, если вы используете другой календарь или дату, вы можете легко это изменить. Список доступных календарей и календарных единиц можно найти в NSCalendar
Ссылка на класс. Больше информации о NSDateComponents
можно найти в NSDateComponents
Ссылка на класс.
Для справки, доступ к отдельным компонентам из NSDateComponents
довольно просто:
NSInteger day = [components day];
NSInteger month = [components month];
NSInteger year = [components year];
Вы просто должны быть внимательны NSDateComponents
не будет содержать достоверную информацию для любых полей, которые вы запрашиваете, если вы не сгенерировали их с этой действительной информацией (например, запрос NSCalendar
предоставить эту информацию NSCalendarUnit
с). 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];
Просто чтобы перефразировать превосходный (и работающий!) Код Itai, вот как будет выглядеть пример вспомогательного класса для возврата значения года данной переменной 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).
Свифт 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 веселая версия
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.0 (и OS X 10) вы можете использовать метод компонента, чтобы упростить получение одного компонента даты, например:
int year = [[NSCalendar currentCalendar] component:NSCalendarUnitYear fromDate:[NSDate date]];
Должно сделать вещи проще и, надеюсь, это будет реализовано эффективно.
Если вы ориентируетесь на iOS 8+, вы можете использовать новый NSCalendar
удобные методы для достижения этого в более кратком формате.
Сначала создайте NSCalendar
и использовать что угодно NSDate
необходимо.
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 Manipulation Made Easy в iOS 8. Отказ от ответственности, я написал пост.
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)
Попробуй это.,,
Фрагмент кода:
NSDateComponents *components = [[NSCalendar currentCalendar] components:NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear fromDate:[NSDate date]];
int year = [components year];
int month = [components month];
int day = [components day];
Это дает текущий год, месяц, дату
Если вы хотите получить отдельные NSDateComponents от NSDate, вам определенно понадобится решение, предложенное Itai Ferber. Но если вы хотите перейти от NSDate напрямую к NSString, вы можете использовать NSDateFormatter.
стриж
Более простой способ получить любые элементы даты в виде необязательной строки.
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")
Попробуйте следующее:
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
Чтобы получить удобочитаемую строку (день, месяц, год), вы можете сделать:
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateStyle:NSDateFormatterMediumStyle];
NSString *string = [dateFormatter stringFromDate:dateEndDate];
Я делаю таким образом....
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);