Класс NSDate автоматически представляет дату и время в виде количества секунд (типа NSTimelnterval), отсчитываемых относительно некоторой исходной даты.

В результате вызова [NSDate new] или [NSDate date] получается объект даты для текущих даты и времени. Для выполнения других операций над датами могут потребоваться классы NSDateComponents и NSCalendar, хотя сделать это будет не так-то просто в силу сложной организации календарей (см. документацию Date and Time Programming Guide). Ниже приведен пример составления даты по ее календарным значениям.

NSCalendar* greg -

[[NSCalendar alloc] initWithCalendarldentifier:NSGregorianCalendar];

NSDateComponents* comp - [NSDateComponents new];

comp.year - 2013;

comp.month - 8;

comp.day - 10;

comp.hour - 15;

NSDate* d - [greg dateFromComponents:comp];

Аналогично, для выполнения арифметических операций над датами служит класс NSDateComponents. Ниже показано, как добавить один день к текущей дате:

NSDate* d — // любая дата

NSDateComponents* comp - [NSDateComponents new];

comp.day “ 1;

NSCalendar* greg -

[[NSCalendar alloc] initWithCalendarldentifier:NSGregorianCalendar];

NSDate* d2 - [greg dateByAddingComponents:comp toDate:d options:0];

He менее важно представление дат в виде символьных строк. Для создания и синтаксического анализа символьных строк с датами служит класс NSDateFormatter, использующий строковый формат, аналогичный возвращаемому методом stringWithFormat: из класса NSString. Дело усложняется тем, что точное строковое представление составляющей или формата даты может зависеть от пользовательских региональных настроек, включая местный язык, формат и календарь. (На самом деле региональные настройки следует учитывать и при форматировании символьных строк средствами класса NSString.)

В следующем примере, взятом из одного из моих приложений, подготавливается содержимое метки типа UILabel, чтобы сообщить в ней дату и время последнего обновления данных. Это приложение не локализовано. В частности, слово "at" (в) появляется в символьной строке не переведенным с английского языка, и поэтому требуется также проконтролировать полностью представление составляющих даты и времени. Для этого придется опереться на конкретные региональные настройки.

NSDateFormatter *df = [NSDateFormatter new];

if ( [[NSLocale availableLocaleldentifiers] indexOfObject:@"en_US"]

!= NSNotFound) {

NSLocale* loc = [[NSLocale alloc] initWithLocaleldentifier:@"en_US"];

[df setLocale:loc]; // английские, по возможности, названия месяца //и часового пояса

}

[df setDateFormat:'Updated' d ММММ уууу 'at' h:mm a z"];

NSString* updatedString = [df stringFromDate: [NSDate date]]; // текущая дата

С другой стороны, опираясь на пользовательские региональные настройки, можно отформатировать дату с помощью метода dateFormatFromTemplate: options : locale: из класса NSDateFormatter и текущих региональных настроек. В качестве “шаблона” служит символьная строка, в которой перечисляются используемые составляющие даты, но их порядок следования, знаки препинания и представление на местном языке отдаются полностью на откуп региональным настройкам, как показано ниже.

NSDateFormatter *df = [NSDateFormatter new];

NSString* format =

[NSDateFormatter dateFormatFromTemplate:@"dMMMMyyyyhmmaz" options:0 locale:[NSLocale currentLocale]];

[df setDateFormat:format];

NSString* updatedString = [df stringFromDate: [NSDate date]]; // текущая дата

На мобильном устройстве, где установлены французские региональные настройки, например, по команде Settings ^General ^International ^Region Format, результат может выглядеть следующим образом: 20 juillet 2013 5:14 PM UTC-7. Обратите внимание на то, что местный язык региональных настроек не является системным, т.е. результат представлен на французском языке вследствие установки региональных настроек, а не выбора языка на мобильном устройстве. За более подробными сведениями о региональных настройках в целом обращайтесь к документации вашего браузера на библиотеки ICU (International Components for Unicode — Международные компоненты для уникода), откуда происходит поддержка в iOS создания и синтаксического анализа символьных строк данных. Для того чтобы выяснить, какие региональные настройки существуют, обращайтесь по адресу http://demo.icu-project.org/icu-bin/locexp.

Начинающие программировать под iOS час^о совершают ошибку, забывая о том, что дата содержит часовой пояс. Например, при регистрации объекта типа NSDate средствами класса NSLog время (и день) может быть интерпретировано неверно, поскольку значение даты представлено в часовом поясе по Гринвичу. Во избежание подобной ошибки следует вызвать метод descriptionWithLocale:, предоставляющий требуемые (обычно текущие) региональные настройки, или же воспользоваться средством форматирования даты.


 

 

 

Добавить комментарий