Как разобрать и извлечь год, месяц, день и т. Д. Из временного интервала на Iphone IOS - PullRequest
3 голосов
/ 14 ноября 2011

Я медленно вхожу в разработку iOS и пытаюсь создать таймер обратного отсчета с определенной даты.Я выяснил код, который дает мне интервал в секундах, но я не мог понять, как извлечь из него значения Год / Месяц / День / Час / Минута / секунда, чтобы отобразить каждое значение в своей метке в виде тикера.

До сих пор я понял, что следующее даст мне интервал между двумя датами в секундах, и я пытаюсь разобрать это и отобразить на моем экране это как тикер, обновив UILabelкаждую секунду, используя NSTimer и вызывающий селектор один раз каждые 1 секунду, и получаю что-то вроде этого на мой взгляд:

6 лет 10 месяцев 13 дней 18 часов 25 минут 18 секунд (очевидно, каждый ярлык будет обновляться соответственно с увеличением времени)

NSDate *startDate = [df dateFromString:@"2005-01-01"];

NSTimeInterval passed = [[NSDate date] timeIntervalSinceDate: startDate];

Спасибо

Ответы [ 2 ]

10 голосов
/ 14 ноября 2011

Использовать NSCalendar с двумя датами:

- (NSDateComponents *)components:(NSUInteger)unitFlags fromDate:(NSDate *)startingDate toDate:(NSDate *)resultDate options:(NSUInteger)opts

Возвращает, как объект NSDateComponents, используя указанные компоненты, разницу между двумя предоставленными датами.

Пример:

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"YYYY-MM-dd"];
NSDate *startingDate = [dateFormatter dateFromString:@"2005-01-01"];
NSDate *endingDate = [NSDate date];

NSCalendar *calendar = [NSCalendar currentCalendar];
NSUInteger unitFlags = NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit|NSHourCalendarUnit|NSMinuteCalendarUnit|NSSecondCalendarUnit;
NSDateComponents *dateComponents = [calendar components:unitFlags fromDate:startingDate toDate:endingDate options:0];

NSInteger days     = [dateComponents day];
NSInteger months   = [dateComponents month];
NSInteger years    = [dateComponents year];
NSInteger hours    = [dateComponents hour];
NSInteger minutes  = [dateComponents minute];
NSInteger seconds  = [dateComponents second];
NSLog(@"%dYears %dMonths %dDays %dHours %dMinutes %dSeconds", days, months, years, hours, minutes, seconds);

Вывод NSLog:

13Years 10Months 6Days 8Hours 6Minutes 7Seconds
2 голосов
/ 14 ноября 2011

Ну, так как «месяц» и «год», конечно, будут зависеть от того, какой месяц и какой год (365 или 364 дня в году? 30 или 31 день в месяце?), Вы не можете просто взять время интервал и извлекать годы и месяцы - вы всегда должны получить полную дату, например добавив ваш (измененный) временной интервал обратно к дате начала, например

NSDate* newDate = [startDate dateByAddingTimeInterval:modifiedPassedTimeInterval];

С этой даты вы можете легко извлечь год, месяц и т. Д. С помощью NSDateComponents :

NSDateComponents* dateComponents = [[NSCalendar currentCalendar] components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit fromDate:newDate];
NSInteger day = [dateComponents day];
NSInteger month = [dateComponents month];
NSInteger year = [dateComponents  year];
...