NSDate(十六)

 

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));

        }

posted @ 2016-01-10 16:03  恒远也  阅读(179)  评论(0编辑  收藏  举报