Поиск…


замечания

NSDate - очень простой тип значения, представляющий один точный момент в универсальном времени. Он не содержит информацию о часовых поясах, летнее время, календари или локаль.

NSDate действительно является только неизменной оболочкой вокруг NSTimeInterval которая является double . Нет никакого изменчивого подкласса, как в некоторых других типах значений в Foundation.

Создание NSDate

Класс NSDate предоставляет методы для создания объектов NSDate соответствующих заданной дате и времени. NSDate может быть инициализирован с использованием назначенного инициализатора, который:

Возвращает объект NSDate инициализированный относительно 00:00:00 UTC 1 января 2001 года на заданное количество секунд.

NSDate *date = [[NSDate alloc] initWithTimeIntervalSinceReferenceDate:100.0];

NSDate также предоставляет простой способ создания NSDate равного текущей дате и времени:

NSDate *now = [NSDate date];

Также можно создать NSDate определенное количество секунд с текущей даты и времени:

NSDate *tenSecondsFromNow = [NSDate dateWithTimeIntervalSinceNow:10.0];

Сравнение даты

Существует 4 метода сравнения NSDate s в Objective-C:

  • - (BOOL)isEqualToDate:(NSDate *)anotherDate
  • - (NSDate *)earlierDate:(NSDate *)anotherDate
  • - (NSDate *)laterDate:(NSDate *)anotherDate
  • - (NSComparisonResult)compare:(NSDate *)anotherDate

Рассмотрим следующий пример, используя 2 даты, NSDate date1 = July 7, 2016 и NSDate date2 = July 2, 2016 :

NSDateComponents *comps1 = [[NSDateComponents alloc]init];
comps.year = 2016;
comps.month = 7;
comps.day = 7;

NSDateComponents *comps2 = [[NSDateComponents alloc]init];
    comps.year = 2016;
    comps.month = 7;
    comps.day = 2;

NSDate* date1 = [calendar dateFromComponents:comps1]; //Initialized as July 7, 2016 
NSDate* date2 = [calendar dateFromComponents:comps2]; //Initialized as July 2, 2016 

Теперь, когда NSDate создаются, их можно сравнить:

if ([date1 isEqualToDate:date2]) {
    //Here it returns false, as both dates are not equal
}

Мы также можем использовать earlierDate: и laterDate: класса NSDate :

NSDate *earlierDate = [date1 earlierDate:date2];//Returns the earlier of 2 dates. Here earlierDate will equal date2.
NSDate *laterDate = [date1 laterDate:date2];//Returns the later of 2 dates. Here laterDate will equal date1.

Наконец, мы можем использовать NSDate compare: NSDate :

NSComparisonResult result = [date1 compare:date2];
    if (result == NSOrderedAscending) {
        //Fails
        //Comes here if date1 is earlier than date2. In our case it will not come here.
    }else if (result == NSOrderedSame){
        //Fails
        //Comes here if date1 is the same as date2. In our case it will not come here.
    }else{//NSOrderedDescending
        
        //Succeeds
        //Comes here if date1 is later than date2. In our case it will come here
    }

Преобразование NSDate, который состоит из часа и минуты (только) для полного NSDate

Есть много случаев, когда вы создали NSDate только с часовым и минутным форматом, то есть: 08:12

Недостатком этой ситуации является то, что ваш NSDate почти полностью «голый», и вам нужно создать: день, месяц, год, второй и часовой пояс, чтобы этот объект «играл» с другими типами NSDate.

Для примера предположим, что hourAndMinute - это тип NSDate, который состоит из часового и минутного формата:

NSDateComponents *hourAndMintuteComponents = [calendar components:NSCalendarUnitHour | NSCalendarUnitMinute
                                                         fromDate:hourAndMinute];
NSDateComponents *componentsOfDate = [[NSCalendar currentCalendar] components:NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear
                                                                     fromDate:[NSDate date]];

NSDateComponents *components = [[NSDateComponents alloc] init];
[components setDay: componentsOfDate.day];
[components setMonth: componentsOfDate.month];
[components setYear: componentsOfDate.year];
[components setHour: [hourAndMintuteComponents hour]];
[components setMinute: [hourAndMintuteComponents minute]];
[components setSecond: 0];
[calendar setTimeZone: [NSTimeZone defaultTimeZone]];

NSDate *yourFullNSDateObject = [calendar dateFromComponents:components];

Теперь ваш объект является общей противоположностью тому, чтобы быть «голым».

Преобразование NSDate в NSString

Если ww имеет объект NSDate, и мы хотим преобразовать его в NSString. Существуют разные типы строк даты. Как мы можем это сделать? Это очень просто. Всего 3 шага.

  1. Создать объект NSDateFormatter
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
  1. Установите формат даты, в котором вы хотите свою строку.
    dateFormatter.dateFormat = @"yyyy-MM-dd 'at' HH:mm";
  1. Теперь получим форматированную строку

     NSDate *date = [NSDate date]; // your NSDate object
     NSString *dateString = [dateFormatter stringFromDate:date];
    

Это даст результат примерно так: 2001-01-02 at 13:00

Замечания:

Создание экземпляра NSDateFormatter - дорогостоящая операция, поэтому рекомендуется создать его один раз и повторно использовать, когда это возможно.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow