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

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

Вопрос был: Как я определяю день года для определенной даты?

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

24
задан John Feminella 23 June 2014 в 15:55
поделиться

3 ответа

Попробуйте:

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

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

73
ответ дан 28 November 2019 в 22:20
поделиться

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

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

Хитрость здесь, который я провел так много времени, чтобы выяснить, было использование NSDateFormatter. «D» - флаг на день года.

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

6
ответ дан 28 November 2019 в 22:20
поделиться

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

Если вы укоротите секунды/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;
-2
ответ дан 28 November 2019 в 22:20
поделиться