nic*_*oko 7 objective-c nsdate
我想要获得当年的天数.
当我使用iPhone SDK尝试当月的天数解决方案时?,并通过NSYearCalendarUnit替换NSMonthCalendarUnit,我仍然获得该月的天数.
有谁知道我应该怎么做?
在此先感谢您的帮助.
这是NSCalendarSwift 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)
}
}
Run Code Online (Sandbox Code Playgroud)
你可以像这样使用它:
let calendar = NSCalendar.currentCalendar() // I'm using the Gregorian calendar
calendar.daysInYear() // 365 (since it's currently 2015)
calendar.daysInYear(2016) // 366 (leap year!)
Run Code Online (Sandbox Code Playgroud)
这是超级灵活的,因为我们不假设日历的长度:
let hebrew = NSCalendar(calendarIdentifier: NSCalendarIdentifierHebrew)
hebrew?.daysInYear(-7) // 354
hebrew?.daysInYear(-100) // 384
Run Code Online (Sandbox Code Playgroud)
请享用.
如果您只打算使用Gregorian Calender,您可以手动计算.
http://en.wikipedia.org/wiki/Leap_year#Algorithm
if year modulo 400 is 0 then leap
else if year modulo 100 is 0 then no_leap
else if year modulo 4 is 0 then leap
else no_leap
Run Code Online (Sandbox Code Playgroud)
我终于想出了一个有效的解决方案.我所做的是先计算一年中的月数,然后计算每个月的天数.
代码如下所示:
NSUInteger days = 0;
NSCalendar *calendar = [NSCalendar currentCalendar];
NSDate *today = [NSDate date];
NSDateComponents *components = [calendar components:NSYearCalendarUnit fromDate:today];
NSUInteger months = [calendar rangeOfUnit:NSMonthCalendarUnit
inUnit:NSYearCalendarUnit
forDate:today].length;
for (int i = 1; i <= months; i++) {
components.month = i;
NSDate *month = [calendar dateFromComponents:components];
days += [calendar rangeOfUnit:NSDayCalendarUnit
inUnit:NSMonthCalendarUnit
forDate:month].length;
}
return days;
Run Code Online (Sandbox Code Playgroud)
它并不像我希望的那样整洁,但它适用于任何日历,如普通的格里高利或伊斯兰日历.
| 归档时间: |
|
| 查看次数: |
2952 次 |
| 最近记录: |