zoukankan      html  css  js  c++  java
  • 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));

            }

  • 相关阅读:
    "科林明伦杯"哈理工第九届——分布式服务(概率期望+思维)
    Nim游戏——简单博弈论
    acwing 1252搭配购买(并查集 + 01背包 )
    [LeetCode] 67. Add Binary
    [LeetCode] 415. Add Strings
    [LeetCode] 43. Multiply Strings
    [LeetCode] 412. Fizz Buzz
    [LeetCode] 201. Bitwise AND of Numbers Range
    [LeetCode] 389. Find the Difference
    [LeetCode] 326. Power of Three + 342. Power of Four
  • 原文地址:https://www.cnblogs.com/DevinSMR/p/5118614.html
Copyright © 2011-2022 走看看