NSDate是oc的一个日期和时间的处理类
当拿到一个新的类的时候,首先想到的是这个类的初始化方法,这个NSDate类的初始化方法是:
NSDate *date = [[NSDate alloc]init];//格林威治时间 NSLog(@"%@",date);//2015-04-2109:54:53.564 OCLesson7_NSDate[787:27248] 2015-04-21 01:54:53 +0000//格林威治时间 |
NSDate类的初始化方法,得到的值是格林威治时间,因此,要想获取本地的正确时间,需要做一些工作。
NSTimeZone获取时区类
localTimeZone
想要获取本地时间,首先要把时区获取,此时这个NSTimeZone类就可以帮助我们获取时区。
//获取本时区时间 //1.获取时区 NSTimeZone *zone = [NSTimeZone localTimeZone]; // NSLog(@"%@",zone);//2015-04-21 09:57:52.731 OCLesson7_NSDate[803:28151] Local Time Zone (Asia/Harbin (GMT+8) offset 28800) |
解释:
1、localTimeZone这个方法就是获取我们所在的时区。因此打印的就是Local Time Zone (Asia/Harbin (GMT+8) offset 28800)
2、offset 28800,打印出来东八区与0时区所差的秒数为28800秒。
secondsFromGMT获取当前时区与0时区的秒差(时间差)
我们用NSTimeZone得到的时区,也知道了时间差,这个时间差offset为28800秒,对我们后面获取本地正确时间有重要作用。
initWithTimeIntervalSinceNow通过时间差补上时间
获取以上信息后,我们就可以创建本地时间:
//2.创建时间,补时差 NSDate *date2 = [[NSDate alloc ]initWithTimeIntervalSinceNow:offset]; // NSLog(@"%@",date2);//2015-04-21 10:01:52.390 OCLesson7_NSDate[830:29275] 2015-04-21 10:01:52 +0000 |
sleep()
sleep函数,是用来让程序睡眠(暂停执行),sleep(5)表示执行到这句语句时,让程序睡眠5秒。
这里用到sleep是为了让人为的让两个时间产生时间差,sleep(5)是让时间差为5秒。但是此时sleep会有一个不好的效果,就是会让程序暂停执行。若是获取较大的时间差,用sleep的话,将会让程序暂停那么长时间。此时,oc提供了产生时间差的方法。
先看看sleep的用法:
//2.创建时间,补时差 NSDate *date2 = [[NSDate alloc ]initWithTimeIntervalSinceNow:offset]; NSLog(@"%@",date2);//2015-04-21 10:01:52.390 OCLesson7_NSDate[830:29275] 2015-04-21 10:01:52 +0000 //获取时间差 sleep(5);//休息5秒 //新时间 NSDate *date3 = [[NSDate alloc]initWithTimeIntervalSinceNow:offset]; //求两个时间的差 NSTimeInterval ti = [date3 timeIntervalSinceDate:date2]; // NSLog(@"%f",ti);//2015-04-21 10:10:40.473 OCLesson7_NSDate[864:31582] 5.003207 |
解释:
date2获取了当前本地时间,然后程序继续执行,获取date3时,时间已经经过5秒(因为sleep5秒),此时date3的时间为date2时间的5秒后。此时用timeIntervalSinceDate方法计算date3和date2的时间差,即为5秒。
NSTimeInterval是double类型的另一个名字
这个NSTimeInterval是通过typedef double NSTimeInterval;产生的。定义出来的变量也是double类型的。
dateByAddingTimeInterval为一个时间补时差
dateByAddingTimeInterval方法,是为一个时间增加或者减少一个时差(时间差),这里就能很好的弥补了sleep的不足。因为这个方法的参数是一个double的数据,传进去的值是多少,该时间就会把这个值加上或减去,得到一个新的时间。
NSDate *date4 = [[NSDate alloc]initWithTimeIntervalSinceNow:offset]; // NSLog(@"%@",date4);//2015-04-21 10:15:49.651 OCLesson7_NSDate[896:33153] 2015-04-21 10:15:49 +0000 NSDate *date5 = [date4 dateByAddingTimeInterval:60]; // NSLog(@"%@",date5);//2015-04-21 10:15:49.651 OCLesson7_NSDate[896:33153] 2015-04-21 10:16:49 +0000 |
例子中,date5比date4快60秒。
一个例子:
练习,当前时间与一个固定时间的差,在60秒内,输出刚刚,60~3600,输出几分钟前,>3600秒,输出几小时前
//练习,当前时间与一个固定时间的差,在60秒内,输出刚刚,60~3600,输出几分钟前,>3600秒,输出几小时前 NSTimeZone *zone1 = [NSTimeZone localTimeZone]; NSInteger offset1 = [zone1 secondsFromGMT]; NSDate *time1 = [[NSDate alloc]initWithTimeIntervalSinceNow:offset1]; NSDate *date21 = [time1 dateByAddingTimeInterval:- 6*4]; NSDate *date31 = [[NSDate alloc]initWithTimeIntervalSinceNow:offset1]; NSTimeInterval ti1 = [date31 timeIntervalSinceDate:date21]; if(ti1 < 60){ NSLog(@"刚刚"); }else if(ti1 >=60 && ti1 < 3600){ NSLog(@"%.f分钟前..",(ti1 / 60)); }else{ NSLog(@"%.f小时前..",(ti1 / 60 /60)); } |