#iOS时间那点事.net
##NSCalendar + NSDateComponentscode
####NSDateComponents实例化的方式component
#####第一种:orm
<!-- lang: cpp --> // 先定义一个遵循某个历法的日历对象 NSCalendar *greCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; // 经过已定义的日历对象,获取某个时间点的NSDateComponents表示,并设置须要表示哪些信息(NSYearCalendarUnit, NSMonthCalendarUnit, NSDayCalendarUnit等) NSDateComponents *dateComponents = [greCalendar components:NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit | NSWeekCalendarUnit | NSWeekdayCalendarUnit | NSWeekOfMonthCalendarUnit | NSWeekOfYearCalendarUnit fromDate:[NSDate date]]; NSLog(@"year(年份): %i", dateComponents.year); NSLog(@"quarter(季度):%i", dateComponents.quarter); NSLog(@"month(月份):%i", dateComponents.month); NSLog(@"day(日期):%i", dateComponents.day); NSLog(@"hour(小时):%i", dateComponents.hour); NSLog(@"minute(分钟):%i", dateComponents.minute); NSLog(@"second(秒):%i", dateComponents.second); // Sunday:1, Monday:2, Tuesday:3, Wednesday:4, Friday:5, Saturday:6 NSLog(@"weekday(星期):%i", dateComponents.weekday); // 苹果官方不推荐使用week NSLog(@"week(该年第几周):%i", dateComponents.week); NSLog(@"weekOfYear(该年第几周):%i", dateComponents.weekOfYear); NSLog(@"weekOfMonth(该月第几周):%i", dateComponents.weekOfMonth);
若获取dateComponents对象时,设置components的时候未添加NSYearCalendarUnit,dateComponents.year将返回错误的数值,其余的也同样,因此使用NSDateComponents表示时间时,要确保须要使用的数据都在componets中添加了。对象
#####第二种:blog
<!-- lang: cpp --> // 先定义一个遵循某个历法的日历对象 NSCalendar *greCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; // 定义一个NSDateComponents对象,设置一个时间点 NSDateComponents *dateComponentsForDate = [[NSDateComponents alloc] init]; [dateComponentsForDate setDay:6]; [dateComponentsForDate setMonth:5]; [dateComponentsForDate setYear:2004]; // 根据设置的dateComponentsForDate获取历法中与之对应的时间点 // 这里的时分秒会使用NSDateComponents中规定的默认数值,通常为0或1。 NSDate *dateFromDateComponentsForDate = [greCalendar dateFromComponents:dc]; // 定义一个NSDateComponents对象,设置一个时间段 NSDateComponents *dateComponentsAsTimeQantum = [[NSDateComponents alloc] init]; [dateComponentsForDate setDay:6]; // 在当前历法下,获取6天后的时间点 NSDate *dateFromDateComponentsAsTimeQantum = [greCalendar dateByAddingComponents:dateComponentsAsTimeQantum toDate:[NSDate date] options:0];
#####第三种:ip
<!-- lang: cpp --> // 先定义一个遵循某个历法的日历对象 NSCalendar *greCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; // 根据两个时间点,定义NSDateComponents对象,从而获取这两个时间点的时差 NSDateComponents *dateComponents = [greCalendar components:NSYearCalendarUnit fromDate:[NSDate dateWithTimeIntervalSince1970:0] toDate:[NSDate date] options:0]; NSLog(@"number of years:%i", dateComponents.year);
####NSCalendar中比较重要的方法和概念 #####firstWeekday开发
firstWeekday是你们比较容易浑淆的东西。get
你们在使用dateComponents.weekday获取某天对应的星期时,会发现,星期日对应的值为1,星期一对应的值为2,星期二对应的值为3,依次递推,星期六对应的值为7,这与咱们平时理解的方式不同。而后,咱们就开始找是否是能够设置这种对应关系。终于,咱们在NSCalendar中发现了firstWeekday这个变量,从字面意思上看貌似就是咱们寻找的那个东西。但是,设置过firstWeekday后,咱们又发现彻底没有做用,真是郁闷啊!其实,你们没必要郁闷,由于郁闷也没用,iOS中规定的就是周日为1,周一为2,周二为3,周三为4,周四为5,周五为6,周六为7,没法经过某个设置改变这个事实的,只能在使用的时候注意一下这个规则了。那firstWeekday是干什么用的呢?你们设置一下firstWeekday,再获取一下dateComponents.weekOfYear或dateComponents.weekOfMonth,看看返回的数据是否发生了变化。firstWeekday的做用确实是修改当前历法中周的起始位置,可是不能修改周日对应的数值,只能修改一年或一个月中周的数量,以及周的次序。it
#####-(NSRange)rangeOfUnit:(NSCalendarUnit)smaller inUnit:(NSCalendarUnit)larger forDate:(NSDate *)date;
######答疑解惑:
Unit:单元
NSRange:
typedef struct _NSRange { NSUInteger location; NSUInteger length; } NSRange;
咱们大体能够理解为:某个时间点所在的“小单元”,在“大单元”中的数量(返回值range的location属性变量的值通常是错误的)。例如:
<!-- lang: cpp --> // 当前时间对应的月份中有几天 [[NSCalendar currentCalendar] rangeOfUnit:NSDayCalendarUnit inUnit:NSMonthCalendarUnit forDate:[NSDate date]].length; // 当前时间对应的月份中有几周(前面说到的firstWeekday会影响到这个结果) [[NSCalendar currentCalendar] rangeOfUnit:NSWeekCalendarUnit inUnit:NSMonthCalendarUnit forDate:[NSDate date]].length;
#####-(NSUInteger)ordinalityOfUnit:(NSCalendarUnit)smaller inUnit:(NSCalendarUnit)larger forDate:(NSDate *)date;
咱们大体能够理解为:某个时间点所在的“小单元”,在“大单元”中的位置(从1开始)。例如:
<!-- lang: cpp --> // 当前时间对应的周是当前年中的第几周 [[NSCalendar currentCalendar] ordinalityOfUnit:NSWeekOfYearCalendarUnit inUnit:NSYearCalendarUnit forDate:self]; [[NSCalendar currentCalendar] ordinalityOfUnit:NSWeekCalendarUnit inUnit:NSYearCalendarUnit forDate:[NSDate date]]; // 当前时间对应的周是当前月中的第几周 [[NSCalendar currentCalendar] ordinalityOfUnit:NSWeekOfMonthCalendarUnit inUnit:NSYearCalendarUnit forDate:self]; [[NSCalendar currentCalendar] ordinalityOfUnit:NSWeekCalendarUnit inUnit:NSMonthCalendarUnit forDate:[NSDate date]];
在这里:NSWeekOfYearCalendarUnit, NSWeekOfMonthCalendarUnit与NSWeekCalendarUnit的使用结果相同,为了不浑淆,建议在此处使用NSWeekCalendar,而定义NSDateComponents时使用NSWeekOfYearCalendarUnit和NSWeekOfMonthCalendarUnit。
#####-(BOOL)rangeOfUnit:(NSCalendarUnit)unit startDate:(NSDate **)datep interval:(NSTimeInterval *)tip forDate:(NSDate *)date;
咱们大体能够理解为:“某个时间点”所在的“单元”的起始时间,以及起始时间距离“某个时间点”的时差(单位秒)。例如:
<!-- lang: cpp --> NSDate *startDateOfYear; NSDate *startDateOfMonth; NSDate *startDateOfWeek; NSDate *startDateOfDay; NSTimeInterval TIOfYear; NSTimeInterval TIOfMonth; NSTimeInterval TIOfWeek; NSTimeInterval TIOfDay; [[NSCalendar currentCalendar] rangeOfUnit:NSYearCalendarUnit startDate:&startDateOfYear interval:&TIOfYear forDate:[NSDate date]]; [[NSCalendar currentCalendar] rangeOfUnit:NSMonthCalendarUnit startDate:&startDateOfMonth interval:&TIOfMonth forDate:[NSDate date]]; [[NSCalendar currentCalendar] rangeOfUnit:NSWeekCalendarUnit startDate:&startDateOfWeek interval:&TIOfWeek forDate:[NSDate date]]; [[NSCalendar currentCalendar] rangeOfUnit:NSDayCalendarUnit startDate:&startDateOfDay interval:&TIOfDay forDate:[NSDate date]]; NSLog(@"firstDateOfYear:%@, FirstDateOfMonth:%@, FirstDateOfWeek:%@, FirstDateOfDay:%@", startDateOfYear, startDateOfMonth, startDateOfWeek, startDateOfDay); NSLog(@"TIOfYear:%f, TIOfMonth:%f, TIOfWeek:%f, TIOfDay:%f", TIOfYear, TIOfMonth, TIOfWeek, TIOfDay);
关于NSCalendar和NSDateComponents的介绍暂时说到这里。 到目前为止,已经将iOS开发中关于时间的基本知识介绍完毕,欠缺之处请各位积极批评。
###本系列其余文章不断更新中: