Данная статья целиком посвящена работе с датами в Objective-C и классам NSDate и NSDateFormatter. С помощью первого класса NSDate можно создавать, сравнивать и вычислять даты. Второй класс — NSDateFormatter создан для преобразования дат хранящихся в объектах класса NSDate в объекты класса NSString для последующего вывода на экран пользователю или дальнейшей обработки. С помощью класса NSDateFormatter можно выполнить и обратное преобразование даты хранящейся в строке в объект класса NSDate (например это бывает необходимо при загрузке данных через Интернет в формате JSON). Также класс NSDateFormatter позволяет кастомизировать строку с датой (например вам может понадобится для работы в приложении дата и время, а в другом приложении — также и день недели).

Для вывода результатов будем использовать функцию NSLog(), с которой мы успели поработать в предыдущей статье про NSString. Консоль можно увидеть внизу окна XCode при запуске приложения. Если консоль не открывается, то выберите пункт меню View->Show Debug Area (⇧⌘Y).

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

NSDate

Как мы сказали ранее класс NSDate создан для создания, хранения и вычисления дат. Рассмотрим самый простой метод создания даты date:

NSDate *date = [NSDate date];

NSLog(@"%@", date);

В консоли вы увидите строку примерно следующего вида: 2011-11-06 18:57:34 +0000. Также рассмотрим метод, который позволяет создать дату отличающуюся от текущей dateWithTimeIntervalSinceNow:

NSDate *date = [NSDate dateWithTimeIntervalSinceNow:86400];

NSLog(@"%@", date);

В консоли будет указана дата ровно через сутки от текущей даты: 2011-11-07 18:58:38 +0000. В качестве параметра указывается количество секунд, которое необходимо прибавить к текущей дате. Если в качестве аргумента указать отризцательное значение, то получим дату в прошлом:

NSDate *date = [NSDate dateWithTimeIntervalSinceNow:-86400];

NSLog(@"%@", date);

В консоли будет отображена дата за сутки до текущей даты: 2011-11-05 19:02:51 +0000

Сравнение NSDate

Сравнить две даты можно с помощью известного нам метода compare:

NSDate *dateToday =[NSDate date];

NSDate *datePast = [NSDate dateWithTimeIntervalSinceNow:-86400];
BOOL check = [datePast isEqualToDate:dateToday];
if (check) {
NSLog(@"yes");
}
else {
NSLog(@"no");
}

В консоли мы увидим «no» так как наши даты не равны. Определить более раннюю дату поможет метод earlierDate:

NSDate *dateToday =[NSDate date];

NSDate *datePast = [NSDate dateWithTimeIntervalSinceNow:-86400];
NSDate *early = [datePast earlierDate:dateToday];
NSLog(@"%@", early);

В результатах мы видим вчерашнюю дату: 2011-11-05 19:10:06 +0000. Узнать более позднюю дату можно с помощью метода laterDate:

NSDate *dateToday =[NSDate date];

NSDate *datePast = [NSDate dateWithTimeIntervalSinceNow:-86400];
NSDate *later = [datePast laterDate:dateToday];
NSLog(@"%@", later);

В консоли мы увидим текущую дату: 2011-11-06 19:11:03 +0000

NSDateFormatter

Как мы узнали ранее с помощью данного класса можно выполнять преобразования объектов класса NSDate в строку и обратно, а также определять формат вывода дат на экран. Рассмотри метод который позволяет преобразовать NSDate в строку — stringFromDate:

NSDate *dateToday =[NSDate date];

NSDateFormatter *format = [[NSDateFormatter alloc] init];
[format setTimeStyle:NSDateFormatterNoStyle];
[format setDateStyle:NSDateFormatterMediumStyle];
NSString *string = [format stringFromDate:dateToday];
NSLog(@"%@", string);
[format release];

В консоли мы увидим «07.11.2011». Обратите внимание, что перед тем как вызвать интересующий нас метод, мы указали в какой формат необходимо преобразовать нашу дату. Это делается с помощью двух дополнительных методов setTimeStyle и setDateStyle. Для методов setTimeStyle и setDateStyle есть несколько вариантов аргументов:

NSDateFormatterNoStyle — дата или время не выводятся

NSDateFormatterShortStyle — “11/23/37” или “3:30pm”.

NSDateFormatterMediumStyle — “Nov 23, 1937”

NSDateFormatterLongStyle — “November 23, 1937” или “3:30:32pm”.

NSDateFormatterFullStyle — “Tuesday, April 12, 1952 AD” or “3:30:42pm PST”

Попробуйте самостоятельно изменить аргументы и посмотреть полученные результаты. Попробуем получить дату исходя из известной нам строки с помощью метода dateFromString:

NSDateFormatter *format = [[NSDateFormatter alloc] init];

[format setTimeStyle:NSDateFormatterNoStyle];
[format setDateStyle:NSDateFormatterMediumStyle];
NSString *string = @"07.11.2011";
NSDate *dateToday = [format dateFromString:string];
NSLog(@"%@", dateToday);
[format release];

В консоли мы увидим: 2011-11-06 19:00:00 +0000. В данном результате странными на первый взгяд кажутся две вещи: откуда появилось время, если мы не указывали часы и минуты? и откуда взялось шестое число, в то время когда в строке указано седьмое? Дело в том, что симулятор и реальный девайс использует региональные настройки даты и времени. В нашем примере мы не указывали часовой пояс и приложение автоматически выставило +0000 следом вычислив дату исходя из разницы часовых поясов. Следует отметить, что в консоль мы выводим объект NSDate, а даты в нем храняться всегда в часовом поясе +0000.

Свой формат вывода даты

Часто в приложениях может понадобится свой формат вывода даты и времени. С помощью аргументов для методов setTimeStyle и setDateStyle не всегда можно настроить подходящий вариант формата. Тогда можно смело использовать метод setDateFormat:

NSDate *dateToday =[NSDate date];

NSDateFormatter *format = [[NSDateFormatter alloc] init];
[format setDateFormat:@"hh:mm:ss"];
NSString *string = [format stringFromDate:dateToday];
NSLog(@"%@", string);
[format release];

В консоли мы увидим часы, минуты и секунды: 12:58:30. Ниже приведен список с возможными значениями для форматирования даты времени:


s: 0~59 (секунды)
m: 0~59 (минуты)
h: 1~12 (час (12))
d: 1~31 (день месяца)
M/MM: 1~12 (месяц)
y/yyyy: (год)
a: AM/PM
A: 0~86399999 (количество миллисекунд)
c/cc: 1~7 (день недели)
ccc: Sun/Mon/Tue/Wed/Thu/Fri/Sat
cccc: Sunday/Monday/Tuesday/Wednesday/Thursday/Friday/Saturday
D: 1~366 (день года)
e: 1~7 (день недели)
E~EEE: Sun/Mon/Tue/Wed/Thu/Fri/Sat
EEEE: Sunday/Monday/Tuesday/Wednesday/Thursday/Friday/Saturday
F: 1~5 (неделя в месяце, первый день недели - понельник)
W: 1~5 (неделя в месяце, первый день недели - воскресенье)
H: 0~23 (час (24))
k: 1~24 (час (24hr)
K: 0~11 (час (12hr))
L/LL: 1~12 (месяц)
LLL: Jan/Feb/Mar/Apr/May/Jun/Jul/Aug/Sep/Oct/Nov/Dec
LLLL: January/February/March/April/May/June/July/August/September/October/November/December
MMM: Jan/Feb/Mar/Apr/May/Jun/Jul/Aug/Sep/Oct/Nov/Dec
MMMM: January/February/March/April/May/June/July/August/September/October/November/December
q/qq: 1~4 (четверть)
qqq: Q1/Q2/Q3/Q4
qqqq: 1st quarter/2nd quarter/3rd quarter/4th quarter
Q/QQ: 1~4 (четверть)
QQQ: Q1/Q2/Q3/Q4
QQQQ: 1st quarter/2nd quarter/3rd quarter/4th quarter
u: (год)
v~vvv: (Аббревиатура часового пояса)
vvvv: (Название часового пояса)
w: 1~53 (неделя в году)
z~zzz: (Аббревиатура часового пояса)
zzzz: (Название часового пояса)
Z: +0000 (RFC 822 часовой пояс)

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

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

Ваш адрес email не будет опубликован.