Aquí hay una extensión súper precisa NSCalendar
en Swift 2:
extension NSCalendar {
func daysInYear(date: NSDate = NSDate()) -> Int? {
let year = components([NSCalendarUnit.Year], fromDate: date).year
return daysInYear(year)
}
func daysInYear(year: Int) -> Int? {
guard let begin = lastDayOfYear(year - 1), end = lastDayOfYear(year) else { return nil }
return components([NSCalendarUnit.Day], fromDate: begin, toDate: end, options: []).day
}
func lastDayOfYear(year: Int) -> NSDate? {
let components = NSDateComponents()
components.year = year
guard let years = dateFromComponents(components) else { return nil }
components.month = rangeOfUnit(NSCalendarUnit.Month, inUnit: NSCalendarUnit.Year, forDate: years).length
guard let months = dateFromComponents(components) else { return nil }
components.day = rangeOfUnit(NSCalendarUnit.Day, inUnit: NSCalendarUnit.Month, forDate: months).length
return dateFromComponents(components)
}
}
Se puede utilizar la siguiente manera:
let calendar = NSCalendar.currentCalendar() // I'm using the Gregorian calendar
calendar.daysInYear() // 365 (since it's currently 2015)
calendar.daysInYear(2016) // 366 (leap year!)
Esto es súper flexible, ya que no suponga nada acerca de la duración del calendario:
let hebrew = NSCalendar(calendarIdentifier: NSCalendarIdentifierHebrew)
hebrew?.daysInYear(-7) // 354
hebrew?.daysInYear(-100) // 384
disfrutar.
Cálculo de días en el año es bastante simple, pero, en general, recomendaría ir con las bibliotecas de fecha/hora disponibles. Hacer cálculos de fecha/hora manualmente siempre regresará y morderá de alguna manera ... – Krumelur
Recomiendo encarecidamente que no lo haga. El tiempo es súper complicado. Si necesita que sus cosas funcionen en otros lugares que quizás no utilicen el calendario gregoriano o necesiten trabajar en un pasado lejano (de nuevo, no gregoriano), esto no funcionará. NSCalendar es ideal para resolver este tipo de cosas. –