Đây là tiện ích mở rộng NSCalendar
siêu chính xác trong 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)
}
}
Bạn có thể sử dụng nó như thế này:
let calendar = NSCalendar.currentCalendar() // I'm using the Gregorian calendar
calendar.daysInYear() // 365 (since it's currently 2015)
calendar.daysInYear(2016) // 366 (leap year!)
Đây là siêu linh hoạt vì chúng ta không thừa nhận bất cứ điều gì về độ dài của lịch:
let hebrew = NSCalendar(calendarIdentifier: NSCalendarIdentifierHebrew)
hebrew?.daysInYear(-7) // 354
hebrew?.daysInYear(-100) // 384
Thưởng thức.
Nguồn
2015-08-14 07:25:21
Tính số ngày trong năm là đủ đơn giản, nhưng nói chung tôi khuyên bạn nên sử dụng thư viện ngày/giờ sẵn có. Thực hiện các phép tính ngày/giờ theo cách thủ công sẽ luôn quay trở lại và cắn bạn bằng cách nào đó ... – Krumelur
Tôi thực sự khuyên bạn nên chống lại điều này. Thời gian là siêu phức tạp. Nếu bạn cần công cụ của bạn để làm việc trong các ngôn ngữ khác mà có thể không sử dụng lịch Gregorian hoặc cần phải làm việc trong quá khứ xa xôi (một lần nữa không Gregorian) điều này sẽ không hoạt động. NSCalendar thật tuyệt vời để giải quyết những thứ này. –