iOS-如何将生日转为年龄将年龄转化为日期
1.获取当月的天数
NSCalendar官方API:NSCalendarobjectsencapsulateinformationaboutsystemsofreckoningtimeinwhichthebeginning,length,anddivisionsofayeararedefined.Theyprovideinformationaboutthecalendarandsupportforcalendricalcomputationssuchasdeterminingtherangeofagivencalendricalunitandaddingunitstoagivenabsolutetime
NSCalendar的初始化方法:常用:
//可指定日历的算法NSCalendar*calendar=[[NSCalendaralloc]initWithCalendarIdentifier:NSCalendarIdentifierGregorian];>//currentCalendar取得的值会一直保持在cache中,第一次取得以后如果用户修改该系统日历设定,这个值也不会改变。NSCalendar*calendar=[NSCalendarcurrentCalendar];//如果用autoupdatingCurrentCalendar,那么每次取得的值都会是当前系统设置的日历的值。NSCalendar*autoupdatingCurrent=[NSCalendarautoupdatingCurrentCalendar];//-initWithCalendarIdentifier://如果想要用公历的时候,就要将NSDateFormatter的日历设置成公历。否则随着用户的系统设置的改变,取得的日期的格式也会不一样。NSCalendar*initCalendar=[[NSCalendaralloc]initWithCalendarIdentifier:NSCalendarIdentifierGregorian];NSDateFormatter*formatter=[[NSDateFormatteralloc]init];[formattersetCalendar:initCalendar];NSCalendar官方API翻译:
由此能理解数学英语都辣鸡的我看到它有多懵,NSCalendar功能很强大,还有一点就是我写完日历后,界面会非常卡。最终发现是这个NSCalendar特别特别耗内存。最好能写成全局变量来使用。
1.获取当前月份有多少天:
-(NSInteger)getCurrentMonthForDays{//创建一个日期类对象(当前月的calendar对象)NSCalendar*calendar=[NSCalendarcurrentCalendar];//NSRange是一个结构体,其中location是一个以0为开始的index,length是表示对象的长度。他们都是NSUInteger类型。NSRangerange=[calendarrangeOfUnit:NSCalendarUnitDayinUnit:NSCalendarUnitMonthforDate:[NSDatedate]];NSUIntegernumberOfDaysInMonth=range.length;returnnumberOfDaysInMonth;}
2获取目标月份的天数:
-(NSInteger)getNextNMonthForDays:(NSDate)date{NSCalendar*calendar=[NSCalendarcurrentCalendar];//调用rangeOfUnit方法:(返回一样是一个结构体)两个参数一个大单位,一个小单位(.length就是天数,.location就是月)NSIntegermonthNum=[calendarrangeOfUnit:NSCalendarUnitDayinUnit:NSCalendarUnitMonthforDate:date].length;returnmonthNum;}
3.获取一个目标date(包含某个月的1号数据),或者说获取某个月的1号的date对象
-(NSDate*)getAMonthframDate:(NSDate*)date{//指定日历单位,如日期和月份。(这里指定了年月日,还有其他字段添加单位.特别齐全:世纪,年月日时分秒等等等)NSCalendarUnitdayInfoUnits=NSCalendarUnitEra|NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay;//NSDateComponents封装了日期的组件,年月日时分秒等(个人感觉像是平时用的model模型)NSDateComponents*components=[calendarcomponents:dayInfoUnitsfromDate:date];//指定1号components.day=1;//指定月份(我这里是获取当前月份的下1个月的1号的date对象,所以用的++,其上个月或者其他同理)components.month++;//转成需要的date对象returnNSDate*nextMonthDate=[calendardateFromComponents:components];returnnextMonthDate;}(用到的API基本注释完了下边就不那么多注释了)纯属个人理解,如发现错误的地方请指正,大家共同进步.
4.获取某个月的1号是星期几(必不可少的一个方法,用来布局UI使每月1号与星期队形起来):
刚知道要写日历的时候是懵逼的,对NSdate还好、NSCalendar完全没有概念。查了挺多资料,也在github找了好几个demo想直接拿过来用,不过不太合适所以决定自己写。试了tableView、跟colelctionView,最后选择collectionView需求是展示当前月跟之后三个月的日历。
区头实现星期View->四个分区->区头区尾配合实现效果,上边聊得几个方法处理DataSource.
实例变量selectedIndex(今天的下标):---实现->(获取到今天几号,加上今天周几-1就是日历中今天那个cell所在的位置了)