Voici une extension NSCalendar
super précise dans 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)
}
}
Vous pouvez l'utiliser comme ceci:
let calendar = NSCalendar.currentCalendar() // I'm using the Gregorian calendar
calendar.daysInYear() // 365 (since it's currently 2015)
calendar.daysInYear(2016) // 366 (leap year!)
C'est super flexible puisque nous ne supposons rien sur la longueur du calendrier:
let hebrew = NSCalendar(calendarIdentifier: NSCalendarIdentifierHebrew)
hebrew?.daysInYear(-7) // 354
hebrew?.daysInYear(-100) // 384
Profitez.
Calculer les jours dans l'année est assez simple, mais en général, je recommande d'aller avec les bibliothèques de date/heure disponibles. Faire des calculs de date/heure manuellement reviendra toujours et vous mordra en quelque sorte ... – Krumelur
Je recommande fortement contre cela. Le temps est super compliqué. Si vous avez besoin de votre matériel pour travailler dans d'autres lieux qui ne pourraient pas utiliser le calendrier grégorien ou qui ont besoin de travailler dans un passé lointain (encore une fois pas grégorien) cela ne fonctionnera pas. NSCalendar est génial pour résoudre ce genre de choses. –