2016-07-06 3 views
0

Я хочу узнать количество дней с текущего и прошлого года. Мне удалось придумать этот код, который даст мне дату начала и окончания.Как получить количество дней текущего/прошлого года

Затем я использую NSDateComponents, чтобы получить количество дней в текущем году. Но я получаю 365, что означает количество дней с прошлого года.

Как я могу получить количество дней для последнего и текущего года?

func numOfDaysInYear() { 
     let calendar = NSCalendar.currentCalendar() 
     var interval = NSTimeInterval(0) 
     var startOfYear: NSDate? 
     var endOfYear: NSDate! 
     calendar.rangeOfUnit(.Year, startDate: &startOfYear, interval: &interval, forDate: NSDate()) 
     endOfYear = startOfYear?.dateByAddingTimeInterval(interval - 1) 


     let comp = calendar.components(.Day, fromDate: startOfYear!, toDate: endOfYear, options: .MatchFirst) 
     print(comp.day) 
    } 

ответ

1
endOfYear = startOfYear?.dateByAddingTimeInterval(interval - 1) 

дает дату в течение в текущем году, и его отличие в startOfYear составляет 365 дней, 23 часов и 59 секунд, и, следовательно, результат 365.

Что вы хотите является

let startOfNextYear = startOfYear!.dateByAddingTimeInterval(interval) 
let comp = calendar.components(.Day, fromDate: startOfYear!, toDate: startOfNextYear, options: .MatchFirst) 
print(comp.day) 

, которая дает правильный вывод 366 для високосного 2016 года

Чтобы получить результаты за предыдущий год, просто заменить текущие данные NSDate() по дате «один год назад»:

calendar.dateByAddingUnit(.Year, value: -1, toDate: NSDate(), options: []) 
1

Альтернативный подход

let calendar = NSCalendar.currentCalendar() 
let components = NSDateComponents() 
components.day = 1 
components.month = 1 
let nextFirstJanuar = calendar.nextDateAfterDate(NSDate(), matchingComponents: components, options: .MatchNextTime)! 
let thisFirstJanuar = calendar.nextDateAfterDate(nextFirstJanuar, matchingComponents: components, options: [.MatchNextTime, .SearchBackwards])! 
let lastFirstJanuar = calendar.nextDateAfterDate(thisFirstJanuar, matchingComponents: components, options: [.MatchNextTime, .SearchBackwards])! 

let daysInThisYear = calendar.components(.Day, fromDate: thisFirstJanuar, toDate: nextFirstJanuar, options: []).day 
let daysInLastYear = calendar.components(.Day, fromDate: lastFirstJanuar, toDate: thisFirstJanuar, options: []).day 
Смежные вопросы