Как рассчитать день года для конкретной даты в Objective-C? - PullRequest
24 голосов
/ 17 января 2010

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

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

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

Ответы [ 5 ]

73 голосов
/ 17 января 2010

Попробуйте это:

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

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

6 голосов
/ 17 января 2010

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

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

Уловка, которую я потратил так много времени, заключалась в использовании NSDateFormatter. «D» - флаг дня года.

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

4 голосов
/ 10 марта 2016

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

NSCalendar *greg    = [NSCalendar calendarWithIdentifier:NSCalendarIdentifierGregorian];
NSUInteger dayOfYear= [greg ordinalityOfUnit:NSCalendarUnitDay inUnit:NSCalendarUnitYear forDate:[NSDate date]];
0 голосов
/ 08 сентября 2018

Swift 4 вариация:

let date = Date() // now
let calendar = Calendar(identifier: .gregorian)
let dayOfYear = calendar.ordinality(of: .day, in: .year, for: Date()) 
0 голосов
/ 17 января 2010

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

Если вы урежете, 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;
...