Это то, на что я потратил часы, чтобы понять, и поэтому хочу поделиться с вами.
Возник вопрос: как определить день года для конкретной даты?
например 15 января — 15-й день, а 31 декабря — 365-й день, когда год не високосный.
Это то, на что я потратил часы, чтобы понять, и поэтому хочу поделиться с вами.
Возник вопрос: как определить день года для конкретной даты?
например 15 января — 15-й день, а 31 декабря — 365-й день, когда год не високосный.
Попробуй это:
NSCalendar *gregorian =
[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSUInteger dayOfYear =
[gregorian ordinalityOfUnit:NSDayCalendarUnit
inUnit:NSYearCalendarUnit forDate:[NSDate date]];
[gregorian release];
return dayOfYear;
где date
— это дата, для которой вы хотите определить день года. Документация по методу NSCalendar.ordinalityOfUnit находится здесь< /сильный>.
Итак, решение, которое я придумал, довольно аккуратное, простое и ни в коем случае не сложное.
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"D"];
NSUInteger dayOfYear = [[formatter stringFromDate:[NSDate date]] intValue];
[formatter release];
return dayOfYear;
Трюк, на который я потратил так много времени, заключался в использовании NSDateFormatter. «D» — это флаг дня года.
Надеюсь, что это было полезно для вас, у кого такая же проблема, как у меня.
Используя ARC и заменив устаревшие символы, ответ Джона Феминеллы будет выглядеть так:
NSCalendar *greg = [NSCalendar calendarWithIdentifier:NSCalendarIdentifierGregorian];
NSUInteger dayOfYear= [greg ordinalityOfUnit:NSCalendarUnitDay inUnit:NSCalendarUnitYear forDate:[NSDate date]];
Свифт 4 вариант:
let date = Date() // now
let calendar = Calendar(identifier: .gregorian)
let dayOfYear = calendar.ordinality(of: .day, in: .year, for: Date())
С 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;