Cocoa Developers Club

Открытый клуб iOS и OS X разработчиков
15 Июнь 2015

Класс NSDate

Written by CocoaDevelopersClub
Картинка профиля CocoaDevelopersClub
Разработка для iOS, Разработка для OS X dev, ios, NSDate, objective-c, osx

NSDate используется для создания, сравнения, представления дат, расчета временных интервалов.

NSDate — это абстрактный класс, представляющий из себя кластер (группу) классов. Единственным публичным классом данного кластера является NSDate.

Объекты, созданные с помощью NSDate, называют «объекты дат». Экземпляры NSDate являются неизменяемыми.

Класс NSDate — основа для произвольных календарных представлений.

Единственный примитивный метод — timeIntervalSinceReferenceDate. Метод служит основой для всех остальных методов интерфейса NSDate. Данный метод возвращает значение времени относительно абсолютной справочной даты: Первая минута, 1 января 2001, по Гринвичу.

NSDate моделирует смену Юлианского календаря на Григорианский в октябре 1582. Календарные вычисления, выполняемые вместе с NSCalendar, учитывают этот переход. Однако отметьте, что в некоторых местах Григорианский календарь приняли в другое время. Например, Великобритания перешла на Григорианский календарь только в сентябре 1752.

NSDate принимает следующие протоколы:

  • NSCopying
  • NSSecureCoding
  • NSObject (NSObject)

Подклассы

Основная причина создания подклассов NSDate — создание методов работающих с другими календарными системами. У вас могут быть и другие причины для создания подклассов.

Методы для замещения

Если вы хотите создать подкласc NSDate, то вы должны выполнить следующие:

объявите подходящую переменную экземпляра для хранения значения даты и времени (относительно абсолютной справочной даты)
переопределите метод timeIntervalSinceReferenceDate, метод должен возвращать правильный временной интервал, на основе вашей переменной экземпляра
переопределите метод инициализации initWithTimeIntervalSinceReferenceDate:

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

Также в подклассе необходимо реализовать все методы протоколов NSCopying и NSCoding.

Ваш класс может использовать свою собственную справочную дату, отличную от абсолютной справочной даты (Первая минута, 1 января 2001, по Гринвичу), используемой в NSDate. Но вы все равно должны использовать абсолютную справочную дату при реализации методов timeIntervalSinceReferenceDate и initWithTimeIntervalSinceReferenceDate:. Если вы не будете использовать абсолютную справочную дату в этих методах, то сравнение между объектами вашего подкласса NSDate и объектами NSDate не будут работать.

Создание и инициализация объектов дат

+(id)date — метод класса, создает и возвращает экземпляр NSDate, представляющий текущую дату. Данный метод для инициализации вызывает метод init

NSDate *today = [NSDate date];
NSLog(@"%@", today);  // 2013-01-13 08:55:19 +0000

 

+(id)dateWithTimeIntervalSinceNow: (NSTimeInterval) seconds — метод класса, создает и возвращает экземпляр NSDate, представляющий дату, которая отличаются от текущей на указанное количество секунд

NSDate *dateInPast = [NSDate dateWithTimeIntervalSinceNow:3600];
NSLog(@"%@", dateInPast); // 2013-01-14 16:22:55 +0000

 

+(id)dateWithTimeInterval: (NSTimeInterval) seconds sinceDate: (NSDate *) date — метод класса, создает и возвращает экземпляр NSDate, представляющий дату, которая отличаются от переданной в аргументе sinceDate на указанное количество секунд

NSDate *today = [NSDate date];
NSDate *date = [NSDate dateWithTimeInterval:3600*24 sinceDate:today];
NSLog(@"%@", date); // 2013-01-15 15:44:34 +0000

 

+(id)dateWithTimeIntervalSinceReferenceDate: (NSTimeInterval) seconds — метод класса, создает и возвращает экземпляр NSDate, представляющий дату, которая отличаются от абсолютной справочной даты на указанное количество секунд

NSDate *date = [NSDate dateWithTimeIntervalSinceReferenceDate:3600];
NSLog(@"%@", date); // 2001-01-01 01:00:00 +0000

 

+(id)dateWithTimeIntervalSince1970: (NSTimeInterval) seconds — метод класса, создает и возвращает экземпляр NSDate, представляющий дату, которая отличается от начала Unix эпохи (1 января 1970 года) на указанное количество секунд. Метод полезен для создания объектов NSDate из значений time_t, возвращенных системными BSD функциями

time_t current_time = time(NULL);
NSDate *date = [NSDate dateWithTimeIntervalSince1970:current_time];
NSLog(@"%@", date); // 2013-01-14 16:58:30 +0000

 

-(id)init — возвращает инициализированный текущей датой экземпляр NSDate

-(id)initWithTimeIntervalSinceNow: (NSTimeInterval) seconds — возвращает экземпляр NSDate инициализированный датой, отличной от текущей на указанное количество секунд

-(id)initWithTimeInterval: (NSTimeInterval) seconds sinceDate: (NSDate *) refDate — возвращает экземпляр NSDate инициализированный датой, отличной от переданной в аргументе refDate даты на указанное количество секунд

-(id)initWithTimeIntervalSinceReferenceDate: (NSTimeInterval) seconds — возвращает экземпляр NSDate инициализированный датой, отличной от абсолютной справочной даты на указанное количество секунд

-(id)initWithTimeIntervalSince1970: (NSTimeInterval) seconds — возвращает экземпляр NSDate инициализированный датой, отличной от начала Unix эпохи на указанное количество секунд. Метод полезен для создания объектов NSDate из значений time_t, возвращенных системными BSD функциями.

Временные границы

+(id)distantFuture — метод класса, создает и возвращает экземпляр NSDate представляющий дату в далеком будущем. Вы можете использовать данный метод, когда в качестве аргумента требуется передать объект даты, которая не наступит в обозримом будущем, фактически будет игнорироваться. Например, NSWindow метод nextEventMatchingMask:untilDate:inMode:dequeue: возвращает nil, если событие, переданное в аргументе eventMask, не произойдет до указанной даты. Вы можете использовать объект, возвращенный distantFuture в качестве аргумента даты для бесконечного ожидание события.

myEvent = [myWindow nextEventMatchingMask:myEventMask
                          untilDate:[NSDate distantFuture]
                             inMode:NSDefaultRunLoopMode
                            dequeue:YES];

 

+(id)distantPast — метод класса, создает и возвращает экземпляр NSDate представляющий дату в далеком прошлом

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

-(BOOL)isEqualToDate: (NSDate *) anotherDate — сравнивает текущий экземпляр NSDate с экземпляром переданным в аргументе anotherDate. Метод возвращает YES, если дата и время экземпляра anotherDate в точности равны дате и времени текущего экземпляра, иначе NO

NSDate *date = [NSDate date];
NSDate *anotherDate = [NSDate dateWithTimeInterval:0 sinceDate:date];
if ([date isEqualToDate:anotherDate]) {
    NSLog(@"date is equal anotherDate");
}

 

-(NSDate *)earlierDate: (NSDate *) anotherDate — возвращает экземпляр NSDate, текущий или anotherDate , который представляет более раннюю дату. Если текущий экземпляр и anotherDate представляют одну и туже дату, возвращается текущий экземпляр. Для сравнения используется метод timeIntervalSinceDate: экземпляров

NSDate *date = [NSDate date];
NSDate *anotherDate = [NSDate dateWithTimeIntervalSinceReferenceDate:3600];
        
NSDate *earlierDate = [date earlierDate:anotherDate];
NSLog(@"%@", earlierDate); // 2001-01-01 01:00:00 +0000

 

-(NSDate *)laterDate: (NSDate *) anotherDate — возвращает экземпляр NSDate, текущий или anotherDate , который представляет более позднюю дату. Если текущий экземпляр и anotherDate представляют одну и туже дату, возвращается текущий экземпляр. Для сравнения используется метод timeIntervalSinceDate: экземпляров

NSDate *date = [NSDate date];
NSDate *anotherDate = [NSDate dateWithTimeIntervalSinceReferenceDate:3600];
        
NSDate *laterDate = [date laterDate:anotherDate];
NSLog(@"%@", laterDate); // 2013-01-14 17:03:08 +0000

 

-(NSComparisonResult)compare: (NSDate *) anotherDate — возвращает значение, соответствующие одной из констант перечисления NSComparisonResult, указывающие на временное различие текущего экземпляра и экземпляра anotherDate.

  • Если экземпляры равны, метод вернет значение соответствующие константе NSOrderedSame
  • Если текущий экземпляр представляет более позднюю дату, чем экземпляр anotherDate, метод вернет значение соответствующие константе NSOrderedDescending
  • Если текущий экземпляр представляет более ранюю дату и время, чем экземпляр anotherDate, метод вернет значение соответствующие константе NSOrderedAscending

Данный метод сравнивает две даты с точностью до доли секунды. Если вы хотите сравнить две даты с меньшей точностью, используйте методы экземпляров timeIntervalSinceDate:

Временные интервалы

-(NSTimeInterval)timeIntervalSinceDate:(NSDate *) anotherDate — возвращает временной интервал, в секундах, между датой, которую представляет текущий экземпляр, и датой которую представляет экземпляр anotherDate

-(NSTimeInterval)timeIntervalSinceNow — возвращает временной интервал, в секундах, между датой, которую представляет текущий экземпляр, и текущей датой

+(NSTimeInterval)timeIntervalSinceReferenceDate — метод класса, возвращает временной интервал, в секундах, между датой, которую представляет текущий экземпляр, и абсолютной справочной датой

-(NSTimeInterval)timeIntervalSinceReferenceDate — возвращает временной интервал, в секундах, между датой, которую представляет текущий экземпляр, и абсолютной справочной датой

-(NSTimeInterval)timeIntervalSince1970 — возвращает временной интервал, в секундах, между датой, которую представляет текущий экземпляр, и началом Unix эпохи (1 января 1970)

-(id)dateByAddingTimeInterval: (NSTimeInterval) seconds — возвращает новый экземпляр NSDate, который представляет дату отличную от даты, которую представляет текущий экземпляр, на указанное количество секунд

Представление даты в виде строки

— (NSString *) description — возвращает строковое представление даты. Формат возвращаемого строкового представления даты может меняться в разных версиях операционной системы. Используйте NSDateFormatter для создания форматированного строкового представления даты

— (NSString *) descriptionWithLocale: (id) locale — возвращает строковое представление даты в указанной локали. Локаль передается в аргументе locale и должна быть экземпляром NSLocale. Если в качестве значения передать nil, то метод вернет строку с представлением даты в международном формате YYYY-MM-DD HH: MM: SS ± HHMM, где ± HHMM — смещение часового пояса в часах и минутах от GMT.

Автор: Антон Добкин

Поделиться

Клубный чат

В Slack-чате нашего клуба более 1500 участников. Присоединяйтесь к нам прямо сейчас!

slack-screen-640

Присоединиться

Для тех, кто уже с нами, вход здесь

Поддержать проект

Мы будем рады, если вы поддержите наш проект небольшим переводом, который пойдет на оплату хостинга и некоторых мелких расходов.

Яндекс-деньгами

Банковской картой

Свежие записи

  • Видео со встречи CocoaHeads Moscow от 11 декабря События
  • Видео со встречи Rambler.iOS от 22 декабря События
  • CocoaConf Belarus 2015
    CocoaConf Belarus 2015 (скидка внутри) События
  • Вы можете помочь проекту Cocoa Developers Club Cocoa Developers Club, Новости

Следуйте за нами

Рубрики

  • Cocoa Developers Club
  • Dev Story
  • Libs-Pods-Tools
  • Swift
  • Архитектура
  • Дизайн
  • Новости
  • Приложения
  • Работа
  • Разработка для iOS
  • Разработка для OS X
  • События

Популярные теги

2gis app apple apps appstore cocoaheads CocoaPods dev droopls English Google ios ipad iphone Moscow mybook.ru objective-c osx PermissionScope Rambler&Co Rambler.iOS Scope swift UIButton UX watchkit wwdc xcode Yandex zvooq.ru История клуба Санкт-Петербург анимация вакансии видео встречи дизайн история разработки класс клуб компонент меню слайды события ссылки

Полезные ссылки

О нашем клубе
Чат нашего клуба
Правила клубного чата

© Cocoa Developers Club 2015