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

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

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

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


person Godisemo    schedule 17.01.2010    source источник


Ответы (5)


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

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

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

person John Feminella    schedule 17.01.2010
comment
вау, это может упростить ситуацию, это почти ответ на мой другой вопрос, stackoverflow.com/questions/2078372 Возможно, лучше :) - person Godisemo; 17.01.2010

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

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

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

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

person Godisemo    schedule 17.01.2010
comment
Аккуратное решение, но не самое аккуратное. ;) Я думаю, что вы немного застряли, думая о датах в годах, месяцах и днях, а не как о непрерывной временной шкале. Даты часто хранятся в виде прошедших секунд (или дней, или миллисекунд, или 1/10000000 секунд) от установленной даты, формат, который позволяет очень легко получить разницу от начала года до конкретной даты. - person Guffa; 17.01.2010
comment
правда, это тяжело при решении задач. Вы застряли в одном подходе и не можете думать об альтернативах. Спасибо - person Godisemo; 17.01.2010
comment
Как использовать этот метод, чтобы получить исламский день года? - person Akshatha Srinivas; 14.03.2017
comment
это старье, но ..... у меня есть приложение, в котором я все еще его использую .. проблема, с которой я столкнулся, связана с високосным годом, например. 01 января 2020 года день года должен быть 0, но он появляется как 365. - person becker; 17.03.2021

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

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

Свифт 4 вариант:

let date = Date() // now
let calendar = Calendar(identifier: .gregorian)
let dayOfYear = calendar.ordinality(of: .day, in: .year, for: Date()) 
person wm.p1us    schedule 08.09.2018

С 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;
person Pablo Santa Cruz    schedule 17.01.2010
comment
Не забудьте добавить единицу, так как полученное значение основано на нуле. - person Guffa; 17.01.2010
comment
Проблема в том, что вам придется проверять год для каждой даты, прежде чем вы сможете вычислить. Вы не хотите, чтобы 1 января 2011 года было 366-м днем ​​в году - person Godisemo; 17.01.2010
comment
Как говорит Годисемо, вы не можете полагаться на большие константы для определения дней. А как насчет високосных секунд? Или странные годы в далеком прошлом, в которых пропали целые недели дней? - person Kendall Helmstetter Gelner; 17.01.2010