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.
Автор: Антон Добкин