之前項目寫過日歷功能,把這部分提取出來
(demo地址)

ScreenFlow.gif
主要用到了NSCalendar、NSDateComponents這兩個類
NSCalendar日歷,支持日歷的計算。
NSDateComponents 一個日期是有年月日時分秒組成的,components這個類的作用就是把日期拆分成單獨的年、月、日、時、分、秒
假設(shè)有某個時間為customDate,類型為NSDate,如何知道改日期的具體年份、月、日呢。這個就要用到NSDateComponents:
先說一下NSDateComponents的這個 方法
- (NSDateComponents *)components:(NSCalendarUnit)unitFlags
fromDate:(NSDate *)date
第一個參數(shù)unitFlags指定日期的日期組件,枚舉類型
NSCalendarUnitEra -- 紀(jì)元單位。
NSCalendarUnitYear -- 年單位。
NSCalendarUnitMonth -- 月單位。范圍為1-12
NSCalendarUnitDay -- 天單位。范圍為1-31
NSCalendarUnitHour -- 小時單位。范圍為0-24
NSCalendarUnitMinute -- 分鐘單位。范圍為0-60
NSCalendarUnitSecond -- 秒單位。范圍為0-60
NSCalendarUnitWeekOfMonth -- 月包含的周數(shù)。
NSCalendarUnitWeekOfYear -- 年包含的周數(shù)。
NSCalendarUnitWeekday -- 工作日單位。范圍為1-7
第二個參數(shù)傳如對應(yīng)的日期
//根據(jù)系統(tǒng)區(qū)域設(shè)置獲取用戶的當(dāng)前日歷
NSCalendar *calendar = [NSCalendar currentCalendar];
//獲取對應(yīng)包含年月日的日期組件
NSDateComponents *components = [calendar components:(NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay) fromDate:customDate];
[components year];//年
[components month];//月
[components day];//日
如何獲取某個日期的上一個月和下一個月,需要用到NSCalendar的日期計算:
- (nullable NSDate *)dateByAddingComponents:(NSDateComponents *)comps toDate:(NSDate *)date options:(NSCalendarOptions)opts;
//上一個月
- (NSDate *)lastMonth:(NSDate *)date{
NSDateComponents *dateComponents = [[NSDateComponents alloc] init];
//設(shè)置月份 -1
dateComponents.month = -1;
//傳入對應(yīng)日期組件進行計算
NSDate *newDate = [[NSCalendar currentCalendar] dateByAddingComponents:dateComponents toDate:date options:0];
return newDate;
}
//下一個月
- (NSDate*)nextMonth:(NSDate *)date{
NSDateComponents *dateComponents = [[NSDateComponents alloc] init];
dateComponents.month = +1;
NSDate *newDate = [[NSCalendar currentCalendar] dateByAddingComponents:dateComponents toDate:date options:0];
return newDate;
}
還有就是需要計算某個月總共有幾天
- (NSInteger)totaldaysInMonth:(NSDate *)date{
NSRange daysInLastMonth = [[NSCalendar currentCalendar] rangeOfUnit:NSCalendarUnitDay inUnit:NSCalendarUnitMonth forDate:date];
return daysInLastMonth.length;
}
以及這個日期是從星期幾開始的:
NSCalendar *calendar = [NSCalendar currentCalendar];
//設(shè)置每周的起始位置
[calendar setFirstWeekday:1];//1.Sun. 2.Mon. 3.Thes. 4.Wed. 5.Thur. 6.Fri. 7.Sat.
NSDateComponents *comp = [calendar components:(NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay) fromDate:date];
[comp setDay:1];
NSDate *firstDayOfMonthDate = [calendar dateFromComponents:comp];
//獲取當(dāng)天在這個月的位置
NSUInteger firstWeekday = [calendar ordinalityOfUnit:NSCalendarUnitWeekday inUnit:NSCalendarUnitWeekOfMonth forDate:firstDayOfMonthDate];