之前项目写过日历功能,把这部分提取出来
(demo地址)
主要用到了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];
网友评论