ПРОГРАММИРОВАНИЕ ПОД IPHONE, IPAD OBJECTIVE-C Часть 1

Дата (NSDate)

Формат даты очень распространен в любом языке программирования. В Objective-C для работы с датой выделен специальный классNSDate. Он позволяет сравнивать даты, преобразовывать их в строки, увеличивать или уменьшать. Чтобы по-ближе познакомиться с этим классом я предлагаю создать проект на основе шаблона Single View Application и назовем его DateExample. Теперь откройте файл ViewController.m и измените метод viewDidLoad:

<code data-result="[object Object]">- (void)viewDidLoad
{
    [super viewDidLoad];

    NSDate *currentDate = [NSDate date];
    NSLog(@"%@", currentDate);
}</code>

Эти две строчки выведут в консоль текущую дату. Это произойдет потому, что метод date класса NSDate возвращает объект со значением текущей даты. При работе с этим классом следует быть очень внимательным. Поскольку каждый раз, когда вы будете пытаться писать слово «NSDate«, Xcode будем предлагать вам написать «NSData«, а это уже совершенно другой класс, объекты которого хранят данные и он не имеет метода date. Но вернемся к нашему коду, как написано выше, в консоль будет выведена строка похожа на эту:

2011-11-18 22:15:23.166 DateExample[2248:f803] 2011-11-18 20:15:23 +0000

Дата написана точно, но не очень эстетично. Дело в том, что при выведенни в консоль компилятор преобразовал дату в строку. И сделал он это с максимальной точностью. Но что если нам достаточно знать дату без секунд? Изменим снова метод viewDidLoad:

<code data-result="[object Object]">- (void)viewDidLoad
{
    [super viewDidLoad];

    NSDate *currentDate = [NSDate date];
    NSLog(@"%@", currentDate);

    NSDateFormatter *dateFormatter = [[NSDateFormatter new] autorelease];
    [dateFormatter setDateStyle:kCFDateFormatterMediumStyle];
    [dateFormatter setTimeStyle:kCFDateFormatterShortStyle];
    NSString *strDate = [dateFormatter stringFromDate:currentDate];
    NSLog(@"%@", strDate);
}</code>

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

2011-11-18 22:48:23.249 DateExample[2411:f803] Nov 18, 2011 10:48 PM

Как видите, помог нам в этом специальный класс NSDateFormatter. Формат даты и времени мы завадали с помощью методов этого класса setDateStyle и setTimeStyle соответственно. Ниже я приведу возможные варианты стилей:

 

Формат даты Формат времени
kCFDateFormatterNoStyle kCFDateFormatterNoStyle
kCFDateFormatterShortStyle kCFDateFormatterShortStyle
kCFDateFormatterMediumStyle kCFDateFormatterMediumStyle
kCFDateFormatterLongStyle kCFDateFormatterLongStyle
kCFDateFormatterFullStyle kCFDateFormatterFullStyle

Поэкспериментируйте с этими параметрами.

Если приведенных вариантов недостаточно — вы можете установить свой:

<code data-result="[object Object]">[dateFormatter setDateFormat:@"EEE, dd MMM yyyy HH:mm:ss ZZZ"];
NSLog(@"%@", [dateFormatter stringFromDate:currentDate]);</code>

Эти две строки приведут к выводу в консоль приблизительно следующего текста:

Fri, 24 Feb 2012 14:25:57 +0200

Преобразовывать дату в строку мы научились, но что делать, если необходимо выполнить такую же операцию, но наоборот? К примеру, мы получили от сервера список друзей с их датами рождения. И эти даты в формате строки. NSDateFormatter справится и с этой задачей. Добавьте следующий код в метод viewDidLoad:

<code data-result="[object Object]">NSString *currentStrDate = @"2008/08/18 13-45-01";
NSDateFormatter *dateFormatterStr = [[NSDateFormatter new] autorelease];
[dateFormatterStr setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
[dateFormatterStr setDateFormat:@"yyyy/MM/dd HH-mm-ss"];
NSDate *dateFromStr = [dateFormatterStr dateFromString:currentStrDate];
NSLog(@"%@", dateFromStr);</code>

Исходная строка у нас была «2008/08/18 13-45-01» на основании нее мы установили обекту класса NSDateFormatter формат даты «yyyy/MM/dd HH-mm-ss», а он, используя этот формат,  преобразовал строку в дату (правильно распознав дату и время, в плоть до секунд). Чтобы убедится в результате — я вывел полученное значение даты в консоль:

2011-11-18 23:08:48.878 DateExample[489:707] 2008-08-18 13:45:01 +0000

Безусловно, преобразование даты является самым востребованым, но вам может пригодиться увеличение даты:

<code data-result="[object Object]">NSDate *newDate = [currentDate dateByAddingTimeInterval:60*60*24];
NSLog(@"%@", newDate);</code>

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

Для сравнения двух дат следует воспользоваться методом isEqualToDate:

<code data-result="[object Object]">BOOL equal = [currentDate isEqualToDate:newDate];
NSLog(@"%i", equal);</code>

Результатом работы этого метода будет булевское значение. Так же, для сравнения двух дат можно воспользоваться методами earlierDate и laterDate.

<code data-result="[object Object]">NSLog(@"earlier:%@", [currentDate earlierDate:newDate]);
NSLog(@"later:%@", [currentDate laterDate:newDate]);</code>

Результатом такого сравнения будет объект типа NSDate, который будет содержать дату раньше (earlierDate) или позже (laterDate).

 

Исходный код этого проекта можно скачать здесь.

Comments are closed.