Подтвердить что ты не робот

Как вы вычисляете день года на определенную дату в Objective-C?

Это то, что я обнаружил, что трачу часы на то, чтобы разобраться и поэтому хочу поделиться с вами.

Вопрос: как определить день года на конкретную дату?

например. 15 января - 15-й день, а 31 декабря - 365-й день, когда он не високосный год.

4b9b3361

Ответ 1

Попробуйте следующее:

NSCalendar *gregorian =
   [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSUInteger dayOfYear =
   [gregorian ordinalityOfUnit:NSDayCalendarUnit
     inUnit:NSYearCalendarUnit forDate:[NSDate date]];
[gregorian release];
return dayOfYear;

где date - дата, в которую вы хотите определить день года. Документация по методу NSCalendar.ordinalityOfUnit здесь.

Ответ 2

Итак, решение, которое я придумал, довольно аккуратно и просто и не сложно.

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"D"];
NSUInteger dayOfYear = [[formatter stringFromDate:[NSDate date]] intValue];
[formatter release];
return dayOfYear;

Трюк, который я потратил так долго, чтобы понять, это использовать NSDateFormatter. "D" - это флаг для дня года.

Надеюсь, что это было полезно для вас, у кого такая же проблема, как у меня.

Ответ 3

Используя ARC и заменяя устаревшие символы, ответ Джона Фэминеллы будет выглядеть так:

NSCalendar *greg    = [NSCalendar calendarWithIdentifier:NSCalendarIdentifierGregorian];
NSUInteger dayOfYear= [greg ordinalityOfUnit:NSCalendarUnitDay inUnit:NSCalendarUnitYear forDate:[NSDate date]];

Ответ 4

С классом NSDate. Используйте сообщение timeIntervalSinceDate. Он вернет вам значение NSTimeInterval (на самом деле это двойное число), которое представляет секунды, прошедшие с момента, когда вы захотите. После этого легко конвертировать секунды в день.

Если вы усекаете seconds/86400, вы получите дни.

Предположим, вы хотите, чтобы дни с 1 января 2010 года.

// current date/time
NSDate *now = [[NSData alloc] init]; 

// seconds elapsed since January 1st 2010 00:00:00 (GMT -4) until now
NSInteval interval = [now timeIntervalSinceDate: [NSDate dateWithString:@"2010-01-01 00:00:00 -0400"]];

// days since January 1st 2010 00:00:00 (GMT -4) until now
int days = (int)interval/86400;