NSDate год/месяц/день


как я могу получить год / месяц / день

17 280

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