Вопрос

Как я могу получить год / месяц / день 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год / месяц / день. Есть ли другое решение?

Это было полезно?

Решение

Поскольку это, видимо, мой самый популярный ответ, я постараюсь редактировать его, чтобы содержать немного больше информации.

Несмотря на свое имя, 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 предоставить эту информацию с NSCalendarUnits). 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];

Просто для Reword Itai's отлично (и работает!) Код, вот как будет выглядеть образец помощника в хелперном классе, чтобы вернуть год Значение данной переменной 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)

Свифт 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)

Бонус Свифт 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+, вы можете использовать новый 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 было легко в iOS 8. Отказ Отказ от ответственности, я написал сообщение.

Как в iOS 8.0 (и OS X 10) вы можете использовать составная часть Метод упростить получение единого компонента даты, как так:

int year = [[NSCalendar currentCalendar] component:NSCalendarUnitYear fromDate:[NSDate date]];

Должны делать вещи проще и надеюсь, что это реализуется эффективно.

Если вы хотите получить отдельных NSDateComponents от NSDate, вам определенно понадобится решение, предложенное Itai Ferber. Но если ты хочешь Чтобы перейти от 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) 

Попробуй это . Отказ Отказ

Кодовый фрагмент:

 NSDateComponents *components = [[NSCalendar currentCalendar] components:NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear fromDate:[NSDate date]];
 int year = [components year];
 int month = [components month];
 int day = [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

Быстрый

Простой способ получить какие-либо элементы даты в качестве дополнительной строки.

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

Я делаю таким образом ....

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];
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top