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

}

时间: 2024-10-29 19:13:26

NSDate(十六)的相关文章

Powershell管理系列(二十六)PowerShell操作之批量导出&导入邮箱

-----提供AD\Exchange\Lync\Sharepoint\CRM\SC\O365等微软产品实施及外包,QQ:185426445.电话18666943750 项目中有时候做跨林邮箱迁移的时候,条件不成熟,比如安全考虑或者其他考虑,不能做双林信任,这样就提出了一个问题,历史邮件需要使用的话怎么办,一个简单高效的解决办法就是从源森林批量导出邮件为.pst文件,在批量导入到目的域森林,具体操作如下: 1.赋予管理账号邮件导入导出权限,命令如下: cls whoami New-Manageme

QT开发(十六)——QT绘图实例-钟表

QT开发(十六)--QT绘图实例-钟表 一.钟表实现原理 钟表的实现需要设置定时器,定时器每隔一秒发送timeout()信号到QWidget::update()槽函数,update()槽函数将会重绘一次窗口,重写重绘事件函数paintEvent(QPaintEvent *event),根据获取的当前系统时间的时钟.分钟.秒钟重绘钟表的时针.分针.秒针. QTimer *timer = new QTimer(this); timer->start(1000);//一秒钟 connect(timer

Objective-C(十六、内存管理,自动释放池,ARC,强指针,弱指针,方法族)——iOS开发基础

结合之前的学习笔记以及参考<Objective-C编程全解(第三版)>,对Objective-C知识点进行梳理总结.知识点一直在变,只是作为参考,以苹果官方文档为准~ 十六.内存管理相关知识(二) 1.autorelease,自动释放机制 - (instancetype)autorelease; (1)自动释放池的创建 iOS5.0之前 NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; //进行一系列操作 //此处不可以使用

第三百一十六节,Django框架,中间件

第三百一十六节,Django框架,中间件 django 中的中间件(middleware),在django中,中间件其实就是一个类,在请求到来和结束后,django会根据自己的规则在合适的时机执行中间件中相应的方法. 在django项目的settings模块中,有一个 MIDDLEWARE变量,其中每一个元素就是一个中间件(也就是一个中间件模块的一个类),如下. settings模块中 #中间件 MIDDLEWARE = [ 'django.middleware.security.Securit

code第一部分数组:第十六题 数组表示数,加一操作

code第一部分数组:第十六题  数组表示数,加一操作 Given a number represented as an array of digits, plus one to the number. #include <iostream> #include <stdlib.h> #include <stdio.h> #include <vector> using namespace std; int * addone(int *a,int n) { in

杰克?康菲尔德:佛法心理疗愈的二十六项原则

https://www.douban.com/note/518933460/ 该文整理于临床心理学博士.禅修大师杰克•康菲尔德所著<慧心自在>,此书结合禅修思想与心理治疗,将灵性修行落实于日常生活,治愈身心的疾病.适合以下人群: 1.医生或心理治疗专业人员 2.刚接触佛法,对禅坐也很陌生的人 3.对佛法的修炼经验较丰富者 4.对生命探索充满无限好奇的人 5.渴望心灵健康和心灵提升的人 第一部分 你到底是谁 第一项原则 观看众人的内在神圣性和美德.第二项原则 慈悲是我们最深的天性,它源于我们与万

Python之路【第十六篇】:Django【基础篇】

Python之路[第十六篇]:Django[基础篇] Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了ORM.模型绑定.模板引擎.缓存.Session等诸多功能. 基本配置 一.创建django程序 终端命令:django-admin startproject sitename IDE创建Django程序时,本质上都是自动执行上述命令 其他常用命令: python manage.py runserver

【OpenCV十六新手教程】OpenCV角检测Harris角点检测

本系列文章由@浅墨_毛星云 出品.转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/29356187 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 知乎:http://www.zhihu.com/people/mao-xing-yun 邮箱: [email protected] 写作当前博文时配套使用的OpenCV版本号: 2.4.9 本篇文章中,我们一起探讨了OpenCV

16. 蛤蟆的数据结构进阶十六排序实现之基数排序

16. 蛤蟆的数据结构进阶十六排序实现之基数排序 本篇名言:"社会犹如一条船 ,每人都要有掌舵的准备.--易卜生" 我们来看下基数排序. 欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/47760601 1.  基数排序 基数排序(radix sort)属于"分配式排序"(distributionsort),又称"桶子法"(bucket sort)或bin sort,顾名思义,