Класс NSDate автоматически представляет дату и время в виде количества секунд (типа NSTimelnterval), отсчитываемых относительно некоторой исходной даты.
В результате вызова [NSDate new] или [NSDate date] получается объект даты для текущих даты и времени. Для выполнения других операций над датами могут потребоваться классы NSDateComponents и NSCalendar, хотя сделать это будет не так-то просто в силу сложной организации календарей (см. документацию Date and Time Programming Guide). Ниже приведен пример составления даты по ее календарным значениям.
Аналогично, для выполнения арифметических операций над датами служит класс NSDateComponents. Ниже показано, как добавить один день к текущей дате:
He менее важно представление дат в виде символьных строк. Для создания и синтаксического анализа символьных строк с датами служит класс NSDateFormatter, использующий строковый формат, аналогичный возвращаемому методом stringWithFormat: из класса NSString. Дело усложняется тем, что точное строковое представление составляющей или формата даты может зависеть от пользовательских региональных настроек, включая местный язык, формат и календарь. (На самом деле региональные настройки следует учитывать и при форматировании символьных строк средствами класса NSString.)
В следующем примере, взятом из одного из моих приложений, подготавливается содержимое метки типа UILabel, чтобы сообщить в ней дату и время последнего обновления данных. Это приложение не локализовано. В частности, слово "at" (в) появляется в символьной строке не переведенным с английского языка, и поэтому требуется также проконтролировать полностью представление составляющих даты и времени. Для этого придется опереться на конкретные региональные настройки.
С другой стороны, опираясь на пользовательские региональные настройки, можно отформатировать дату с помощью метода dateFormatFromTemplate: options : locale: из класса NSDateFormatter и текущих региональных настроек. В качестве “шаблона” служит символьная строка, в которой перечисляются используемые составляющие даты, но их порядок следования, знаки препинания и представление на местном языке отдаются полностью на откуп региональным настройкам, как показано ниже.
На мобильном устройстве, где установлены французские региональные настройки, например, по команде 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:, предоставляющий требуемые (обычно текущие) региональные настройки, или же воспользоваться средством форматирования даты.