iOS日历功能

之前项目写过日历功能,把这部分提取出来

(demo地址)

iOS日历功能_第1张图片
ScreenFlow.gif

主要用到了NSCalendar、NSDateComponents这两个类
NSCalendar日历,支持日历的计算。
NSDateComponents 一个日期是有年月日时分秒组成的,components这个类的作用就是把日期拆分成单独的年、月、日、时、分、秒

假设有某个时间为customDate,类型为NSDate,如何知道改日期的具体年份、月、日呢。这个就要用到NSDateComponents:
先说一下NSDateComponents的这个 方法

- (NSDateComponents *)components:(NSCalendarUnit)unitFlags 
fromDate:(NSDate *)date

第一个参数unitFlags指定日期的日期组件,枚举类型

NSCalendarUnitEra                 -- 纪元单位。  
NSCalendarUnitYear                -- 年单位。
NSCalendarUnitMonth               -- 月单位。范围为1-12
NSCalendarUnitDay                 -- 天单位。范围为1-31
NSCalendarUnitHour                -- 小时单位。范围为0-24
NSCalendarUnitMinute              -- 分钟单位。范围为0-60
NSCalendarUnitSecond              -- 秒单位。范围为0-60
NSCalendarUnitWeekOfMonth        -- 月包含的周数。
NSCalendarUnitWeekOfYear          -- 年包含的周数。
NSCalendarUnitWeekday             -- 工作日单位。范围为1-7

第二个参数传如对应的日期

//根据系统区域设置获取用户的当前日历
NSCalendar *calendar = [NSCalendar currentCalendar];
//获取对应包含年月日的日期组件
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];
    //设置月份 -1
    dateComponents.month = -1;
    //传入对应日期组件进行计算
    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]; 
//设置每周的起始位置
[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]; 
//获取当天在这个月的位置
NSUInteger firstWeekday = [calendar ordinalityOfUnit:NSCalendarUnitWeekday inUnit:NSCalendarUnitWeekOfMonth forDate:firstDayOfMonthDate]; 

你可能感兴趣的:(iOS日历功能)