1.创建表示 今天的日期对象
NSDate *todayDate = [NSDate date];
NSLog(@"Today's date is %@",todayDate);
// Today's date is 2016-01-19 00:42:29 +0000
2.通过Component创建自定义日期
说明:
要创建自定义日期,需要使用3个Foundation类:NSDate、NSDateComponents与NSCalendar。这里,NSDate作为表示日期的最基本的类。
NSDateComponents类代表构成日期与时间的细节信息:天、月、年与小时。NSDateComponents提供了很多关于日期与时间的细节信息,可以设置这些信息来自定义日期。
NSCalendar类表示真实世界的日历,用于管理与日历相关的复杂操作。可以指定使用的日历或是获取用户系统中采用的日历。通常情况下,可以假定使用的是Gregorian日历,但也可以指定其他日历,比如Hebrew或Islamic日历。
要想创建自定义日期,首先需要新建NSDateComponents实例:
NSDateComponents *dateComponts = [[NSDateComponents alloc] init];
接下来需要设置自定义日期需要的所有属性。笨攻略会设置用于表示美国加利福尼亚洲iPhone发布起始日期的所有组建:
dateComponts.year = 2007;
dateComponts.month = 6;
dateComponts.day = 29;
dateComponts.hour = 12;
dateComponts.minute = 01;
dateComponts.second = 31;
dateComponts.timeZone = [NSTimeZone timeZoneWithAbbreviation:@"PDT"];
//你只需要使用点符号设置感兴趣的日期属性。上面的最后那个属性需要特殊的NSTimeZone对象,可以指定所需的任何时区,也可以不设置该属性以使用系统时区。
//最后,要想创建NSDate对象,需要有指向日历的引用(通常是当前的系统日历),可通过currentCalendar消息[NSCalendar currentCalendar]获得日历引用。接下来,使用dateWithComponents:函数获得与设置相对应的日期对象:
NSDate *iphoneReleaseDate = [[NSCalendar currentCalendar] dateFromComponents:dateComponts];
NSLog(@"%@",iphoneReleaseDate);
3.比较两个日期
//首先比较iPhone发布日期是否是今天,使用isEqualToDate:函数并将需要比较的日期作为参数传递进来,该函数返回一个布尔值:
NSDate *todayDate = [NSDate date];
if (todayDate isEqualToDate:iPhoneReleaseDate) {
}
//要想判断某个日期是否早于另一个日期,请使用earlierDate:函数并将另一个日期作为参数传递进来,该函数返回更早的那个日期:
NSDate *earlierDateIs = [todayDate earlierDate:iPhoneReleaseDate];
//还可以进行相反比较,判断哪个日期更晚:
NSDate *laterDateIs = [todayDate laterDate:iPhoneReleaseDate];
//要想获得两个日期之间相差的秒数,请使用timeIntervalSinceDate:函数并将第二个日期作为参数传递进来,你会得到一个双精度浮点数,其值为两个日期间相差的秒数。这是个名为NSTimeInterval(你会发现其他的日期方法使用了NSTimeInterval)的typedef声明。
//可以通过系统日历与NSDateComponents类获得关于日期比较的更详细信息,这会以你需要的格式返回两个日期间相差的时间,因此,如果想要知道天数、小时数、分钟数、年数、月数或是其中的组合,那么可以从中受益。
//首先需要获得指向用户系统日历的引用:
NSCalendar *systemCalendar = [NSCalendar currentCalendar];
// 接下来,通过对NSCalendar常量进行按位或运算来制定采用的时间单位
unsigned int unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit;
// 可以通过NSCalendar的components:fromDate:toDate:options:函数来返回NSDateComponents对象,对象中的数据描述了根据指定的NSCalendar常量,计算得出的两个日期间的时间差
NSDateComponents *dateComparisonComponents = [systemCalendar components:unitFlags
fromDate:iPhoneReleaseDate
toDate:todaysDate
options:NSWrapCalendarComponents];
4.将字符串转换为日期
NSString *dateString = @"02/14/2012";
NSDateFormatter *df = [[NSDateFormatter alloc] init];
df.dateFormat = @"MM/dd/yyyy";
// 注意:日期格式话器使用了Unicode日期格式,百度以了结更多日期格式的完整列表
// 要想创建日期对象 请使用dateFromString:日期格式化函数
NSDate *valentinesDay = [df dateFromString:dateString];
5.格式化日期以便显示
df.dateFormat = @"EEEE, MMMM d";
//这回显示出日期所处的工作日名称、月份名称与天数
// 使用NSDateFormatter的stringFromDate:函数查看结果
NSLog(@"%@",[df stringFromDate:valentinesDay]);
6.加减日期
// 使用NSDateComponents、NSCalendar类以及日期对象来加减日期。NSDateComponents指定了时间长度(一天、一周或是其他时间间隔)。而借助NSCalendar提供的方法,我们可以通过用户的日历与创建日期组件对象时指定的信息来新建日期
NSDateComponents *weekBeforeDateComponents = [[NSDateComponents alloc] init];
// 要想使用时间间隔,可以设置所需的任何属性。对于该例来说,你只想减掉一周,因此将NSDateComponents对象的week属性设为-1;
weekBeforeDateComponents.week = -1;
// 现在可以通过用户的日历与dateByAddingComponents:toDate:options:函数获得前一周的日期:
NSDate *vDayShoppingDay = [[NSCalendar currentCalendar] dateByAddingComponents:weekBeforeDateComponents toDate:valentinesDay options:0];
// 该函数返回代表前一周的新日期。此外,注意胃了减掉日期,你在使用该函数时用到了负整数(并不存在dateBySubtractingCompinents函数)
7.使用定时器调度并重复执行任务
NSDate *scheduledTime = [NSDate dateWithTimeIntervalSinceNow:10.0];
// 上述调度时间位于上面这一行代码执行后的10秒种。可以再这里使用任何日期
// 接下来 通过initWithFireDate:interval:target:selector:userInfo:repeats构造函数创建定时器
NSString *customUserObject = @"To demo userInfo";
NSTimer *timer = [[NSTimer alloc] initWithFireDate:scheduledTime interval:2 target:self selector:@selector(task) userInfo:customUserObject repeats:YES];
// 说明 第一个参数是日期对象,指定了定时器何时变成活动状态,接下来是间隔时间,是定时器再次发送消息请所需要等待的秒数。之后时目标参数描述符,目标是方法所处的对象。selector参数是位于圆括号中的方法名,前面是@selector关键字。由于方法与定时器一样都位于应用委托中,因此可以使用self关键字
// userInfo是定时器使用的自定义内容。可以使用任何对象,并且可以获得正在执行的消息中的对象引用(上面selector参数),这里使用了字符串,但通常会使用字典或其他集合以支持更加复杂的活动
// repeats参数表示定时器是发送一次消息,还是根据第二个参数指定的时间间隔重复发送
// 接下来需要指向运行循环的引用。可以通过NSRunLoop的currentRunLoop函数获得该引用:
NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
// 现在,只需要将定时器添加到运行循环中即可
[runLoop addTimer:timer forMode:NSDefaultRunLoopMode];
//10s后,定时器将会开始每隔两秒钟向应用发送task消息
// 启动之后,如果想停止定时器,可以向定时器发送invalidate消息。这会从运行循环中删除定时器