NSDate类用于保存时间值,同时提供了一些方法来处理一些基于秒级别时差(Time Interval)运算和日期之间的早晚比较等。

1. NSDate的构造方法和构造获取实例的属性

用于创建NSDate实例的类方法有

+ (instancetype)date;//返回当前时间

+ (instancetype)dateWithTimeIntervalSinceNow:(NSTimeInterval)secs;//返回以当前时间为基准,然后过了secs秒的时间

+ (instancetype)dateWithTimeIntervalSinceReferenceDate:(NSTimeInterval)ti;//返回以2001/01/01 GMT为基准,然后过了secs秒的时间

+ (instancetype)dateWithTimeIntervalSince1970:(NSTimeInterval)secs;//返回以1970/01/01 GMT为基准,然后过了secs秒的时间

+ (instancetype)dateWithTimeInterval:(NSTimeInterval)secsToBeAdded sinceDate:(NSDate *)date;//date实例 加上多少secsToBeAdded 秒后的时间,

@property (class, readonly, copy) NSDate *distantFuture;//返回很多年以后的未来的某一天。(比如你需要一个比现在(Now)晚(大)很长时间的时间值,则可以调用该方法。测试返回了4000/12/31 16:00:00)

@property (class, readonly, copy) NSDate *distantPast;//返回很多年以前的某一天。(比如你需要一个比现在(Now)早(小)大很长时间的时间值,则可以调用该方法。测试返回了公元前0001/12/31 17:00:00)

用于创建NSDate实例的实例方法有

- (id)init;

初始化为当前时间

- (instancetype)initWithTimeIntervalSinceNow:(NSTimeInterval)secs;//初始化为以当前时间为基准,然后过了secs秒的时间

- (instancetype)initWithTimeIntervalSince1970:(NSTimeInterval)secs;//返回以目前的实例中保存的时间为基准,然后过了secs秒的时间

- (instancetype)initWithTimeInterval:(NSTimeInterval)secsToBeAdded sinceDate:(NSDate *)date;//初始化为以date为基准,然后过了secs秒的时间

2. 使用扩展

日期之间比较可用以下方法

- (BOOL)isEqualToDate:(NSDate *)otherDate;

与otherDate比较,相同返回YES

- (NSDate *)earlierDate:(NSDate *)anotherDate;

与anotherDate比较,返回较早的那个日期

- (NSDate *)laterDate:(NSDate *)anotherDate;

与anotherDate比较,返回较晚的那个日期

- (NSComparisonResult)compare:(NSDate *)other;

该方法用于排序时调用:

. 当实例保存的日期值与anotherDate相同时返回NSOrderedSame

. 当实例保存的日期值晚于anotherDate时返回NSOrderedDescending

. 当实例保存的日期值早于anotherDate时返回NSOrderedAscending

//两个NSDate的时间间隔(单位为秒)

获取时间间隔

调用API的时间实例为参考系

- (NSTimeInterval)timeIntervalSinceDate:(NSDate *)anotherDate;//与anotherDate的时间间隔作比

@property (readonly) NSTimeInterval timeIntervalSinceNow;//与当前的时间间隔作比

@property (readonly) NSTimeInterval timeIntervalSince1970;//与1970年时间作弊

- (id)addTimeInterval:(NSTimeInterval)seconds ;

- (instancetype)dateByAddingTimeInterval:(NSTimeInterval)ti;

3. 取回时间间隔可用以下方法

- (NSTimeInterval)timeIntervalSinceDate:(NSDate *)refDate;

以refDate为基准时间,返回实例保存的时间与refDate的时间间隔

- (NSTimeInterval)timeIntervalSinceNow;

以当前时间(Now)为基准时间,返回实例保存的时间与当前时间(Now)的时间间隔

- (NSTimeInterval)timeIntervalSince1970;

以1970/01/01 GMT为基准时间,返回实例保存的时间与1970/01/01 GMT的时间间隔

- (NSTimeInterval)timeIntervalSinceReferenceDate;

以2001/01/01 GMT为基准时间,返回实例保存的时间与2001/01/01 GMT的时间间隔

+ (NSTimeInterval)timeIntervalSinceReferenceDate;

以2001/01/01 GMT为基准时间,返回当前时间(Now)与2001/01/01 GMT的时间间隔

4. 将时间表示成字符串 

@property (readonly, copy) NSString *description;

- (NSString *)descriptionWithLocale:(nullable id)locale;

以YYYY-MM-DD HH:MM:SS ±HHMM的格式表示时间。(其中 "±HHMM" 表示与GMT的存在多少小时多少分钟的时区差异。比如,若时区设置在北京,则 "±HHMM" 显示为 "+0800")

5.如果想让时间持续和系统的时间一致,那就在多线程里开一个定时器,每一秒钟调用一个方法,在方法里重新修改Label上显示的时间;

6.当系统时钟改变时,监听这个广播 可以得到通知 

FOUNDATION_EXPORT NSNotificationName const NSSystemClockDidChangeNotification

7.通过上面的介绍,我们已经基本掌握了NSDate的常用API现在贴上几个实战代码

01. NSDate的基本使用

 //        获取时间
NSDate *date = [NSDate date];
NSLog(@"国际标准时间:%@",date);
// 获取系统当前时区
NSTimeZone *zone = [NSTimeZone systemTimeZone];//中国位于东八区、与国际标准时间相差8小时
// 获取当前时区与格林尼治时间的间隔
NSTimeInterval ti = [zone secondsFromGMTForDate:date];
//获取本地时间
NSDate *localDate = [NSDate dateWithTimeIntervalSinceNow:ti];
NSLog(@"当前时区的时间:%@",localDate);

 02.日期格式转换

 /*
NSDate<->NSString 需要借助NSDateFormatter类
- (NSString *)stringFromDate:(NSDate *)date;
- (NSDate *)dateFromString:(NSString *)string;
*/
// 获取时间
NSDate *date = [NSDate date];
NSLog(@"国际标准时间:%@",date);
// 获取系统当前时区
NSTimeZone *zone = [NSTimeZone systemTimeZone];//中国位于东八区、与国际标准时间相差8小时
// 获取当前时区与格林尼治时间的间隔
NSTimeInterval ti = [zone secondsFromGMTForDate:date];
//获取本地时间
NSDate *localDate = [NSDate dateWithTimeIntervalSinceNow:ti];
NSLog(@"当前时区的时间:%@",localDate);
//
/*日期格式转换*/
NSDateFormatter *dfmt = [[NSDateFormatter alloc]init];
//设置日期格式 注意大小写的区分
dfmt.dateFormat = @"yyyy年MM月dd日 HH时:mm分:ss秒";
//按照日期格式 转化为字符串
//GMT时间转换为日期字符串
NSLog(@"日期转字符串2:%@",[dfmt stringFromDate:date]);
//本地时间对象转化内时间字符串
NSString *localDateString = [dfmt stringFromDate:localDate];//调用这个API时,默认将时间对象认为时格林尼日志时间(内部又重新加了格林尼治时间与当前时区的时差8小时,所以要获取当前时间的字符串对象时,不需要再额外转换成当前时区的时间对象)
NSLog(@"日期转字符串:%@",localDateString);
//按照日期格式 将时间字符串转化为时间对象
NSDate *localDate2 = [dfmt dateFromString:localDateString];
NSLog(@"字符串转日期:%@",localDate2);

03-时间比较

 // insert code here...
/*时间比较
官方提供了4个常用API
比较两个时间的先后
- (NSDate *)earlierDate:(NSDate *)anotherDate;
- (NSDate *)laterDate:(NSDate *)anotherDate;
- (NSComparisonResult)compare:(NSDate *)other;
比较日期是否相等
- (BOOL)isEqualToDate:(NSDate *)otherDate;
//比较两个时间间隔
- (NSTimeInterval)timeIntervalSinceDate:(NSDate *)anotherDate;
*/
NSDate *date1 = [NSDate date];
NSDate *date2 = [NSDate dateWithTimeIntervalSinceNow:];//+10秒 NSDate *tmpDate = [[NSDate alloc]init];
//返回较早那个时间
tmpDate = [date1 earlierDate:date2];
NSLog(@"earlierDate:%@",tmpDate);
//返回较晚那个时间
tmpDate = [date1 laterDate:date2];
NSLog(@"laterDate:%@",tmpDate); //比较两个时间 的时间间隔 (程序员运行消耗原因,会产生微小误差)
NSTimeInterval ti = [date2 timeIntervalSinceDate:date1];
NSLog(@"interval:%lf",ti); if ([date1 isEqualToDate:date2]) {
NSLog(@"两时间相同");
}else{
NSLog(@"两时间不相同");
} NSComparisonResult res = [date1 compare:date2];
switch (res) {
case NSOrderedSame:{
NSLog(@"时间相同");
} break; case NSOrderedAscending:{
NSLog(@"递增关系");//date1较早
} break; case NSOrderedDescending:{
NSLog(@"递减关系");
} break; default:
break;
}

04-系统相关API的调用代码实践

 //============================时间的基本使用=================================//
//1.获取当下时间
NSDate*date=[NSDate date];
MVLog(@"当前:%@",date);
NSTimeInterval tival = 100.0f;
//2.比当下时间晚100s的时间
NSDate *date_late100s_now = [NSDate dateWithTimeIntervalSinceNow:tival];//
MVLog(@"比当下晚100s的时间:%@",date_late100s_now);
//3.比1970年晚100s的时间
NSDate *date_late100s_1970 = [NSDate dateWithTimeIntervalSince1970:tival];//
MVLog(@"比1970年晚100s的时间:%@",date_late100s_1970);
//4.随机返回一个将来的时间
NSDate *date_random_feature = [NSDate distantFuture];//
MVLog(@"distantFuture=%@",date_random_feature);
//5.随机访问一个过去的时间
NSDate *date_random_pass = [NSDate distantPast];//
MVLog(@"distantPass=%@",date_random_pass);
NSDate*date_late1day_now=[NSDate dateWithTimeIntervalSinceNow:**];//
//6.返回早一点的时间
MVLog(@"earlierDate = %@",[date earlierDate:date_late1day_now]);//
//7.返回晚一点的时间
MVLog(@"laterDate = %@",[date laterDate:date_late1day_now]);//
//8.返回从1970到现在的秒数
MVLog(@"timeIntervalSince1970:%f",date.timeIntervalSince1970);//
//9.两个日期是否相同
MVLog(@"date is equal?: %d",[date isEqualToDate:date_late1day_now]);//
//9.两个日期进行比较
NSComparisonResult cmpRes = [date compare:date_late1day_now];//
switch (cmpRes) {
case NSOrderedAscending:{//升序
MVLog(@"升序");
}break;
case NSOrderedSame:{//相等
MVLog(@"相等");
}break;
case NSOrderedDescending:{//降序
MVLog(@"降序");
}break;
}
//10.某日期+上时间间隔--->新日期
NSDate *newDate_adding1dayTival = [date dateByAddingTimeInterval:**];//
MVLog(@"明日:%@",newDate_adding1dayTival);
//11.某日期 距离 00:00:00 UTC on 1 January 2001.这个基准时间 的秒数
NSTimeInterval tival_since2001toNow = [[NSDate date]timeIntervalSinceReferenceDate];
MVLog(@"某日期 距离 00:00:00 UTC on 1 January 2001.这个基准时间 的秒数:%f",tival_since2001toNow);

Foundation框架—时间处理对象NSDate的更多相关文章

  1. Foundation框架—日期类(NSDate)

    一 时间类NSDate .创建一个日期对象     NSDate *date1 = [[NSDate alloc] init]; //创建了一个当前的时间点     NSDate *date2 = [ ...

  2. Foundation框架—时间输出格式NSDateFormatter

    在开发iOS程序时,有时候需要将时间格式调整成自己希望的格式,这个时候我们可以用NSDateFormatter类来处理.下面来介绍NSDateFormatter的常用属性和API:  1.常用属性 @ ...

  3. 【IOS 开发】Objective-C Foundation 框架 -- 字符串 | 日期 | 对象复制 | NSArray | NSSet | NSDictionary | 谓词

    一. 字符串 API 1. NSString 用法简介 (1) NSString API 介绍 NSString 功能 : -- 创建字符串 : 使用 init 开头的实例方法, 也可以使用 Stri ...

  4. 【WIP】Objective-C Foundation框架的主要对象

    创建: 2018/02/02 完成字符串: 2018/02/05 任务表: TODO 最新内容确认: 字符串,数据类, 数组类  可变与不变的对象  一览  种类  不变类  可变类  数组  NSA ...

  5. (译)Getting Started——1.3.3 Working with Foundation(使用Foundation框架)

    在你使用Objective-C语言开发应用时,你会发现在开发中,你会用到很多框架.尤其是Foundation框架,该框架为应用提供了最基础的服务.Foundation框架包括了代表着基本数据类型的va ...

  6. 从今天開始学习iOS开发(iOS 7版)--实现一款App之Foundation框架的使用

    iOSFoundation框架 当你着手为你的应用编写代码的时候,你会发现有很多可供使用的Objective-C的框架类,当中尤其重要的就是基础框架类.它为平台全部的应用提供基础服务.基础框架类中包括 ...

  7. Foundation框架下的常用类:NSNumber、NSDate、NSCalendar、NSDateFormatter、NSNull、NSKeyedArchiver

    ========================== Foundation框架下的常用类 ========================== 一.[NSNumber] [注]像int.float.c ...

  8. (转载)OC学习篇之---Foundation框架中的其他类(NSNumber,NSDate,NSExcetion)

    前一篇说到了Foundation框架中的NSDirctionary类,这一一篇来看一下Foundation的其他常用的类:NSNumber,NSDate,NSException. 注:其实按照Java ...

  9. OC学习篇之---Foundation框架中的其他类(NSNumber,NSDate,NSExcetion)

    1.NSNumber 这个类主要是用来封装基本类型的,说到这里,就不得不说一下了: OC中的集合是不允许存入基本类型的,所以NSNumber类就诞生了,需要将基本类型封装一下,然后存进去,这个类似于J ...

随机推荐

  1. 20145234黄斐《Java程序设计》第一周学习总结

    教材学习内容总结 1.java是SUN公司推出的面相网络的编程语言,当时取名Oak,后改名Java. 2.Java三大平台分别为:Java SE.Java EE与Java ME. 3.Java不仅是程 ...

  2. 青岛Uber司机奖励政策(8月31号~9月6号)

    本周的奖励规则如下,请各位司机朋友按照自己的情况查询. 人民优步(People’s Uber) 滴滴快车单单2.5倍,注册地址:http://www.udache.com/如何注册Uber司机(全国版 ...

  3. CC3200使用MQTT的SSL加密证书可用日期修改

    1. 在使用CC3200进行SSL加密的时候,需要证书,但是证书有一个截止日期,如果当前CC3200没有设置这个日期,那么证书通信会失败,需要添加代码 int setDeviceTime() { Sl ...

  4. letsencrypt证书-使用certbot申请wildcard证书

    目录 1. certbot安装 2. 认证方式 3. 运行命令 4. 更新 1:下载 2:配置 3:申请证书 4:续期证书 1. certbot安装 cd /usr/local/src wget ht ...

  5. redis 类型、方法

    之前使用redis,现在对所有redis方法做一个总结: string类型 形式:key=>value; 说明:最简单的类型:一个key对应一个value,value保存的类型是二进制安全的,s ...

  6. WPF & EF & Prism useful links

    Prism Attributes for MEF https://msdn.microsoft.com/en-us/library/ee155691%28v=vs.110%29.aspx Generi ...

  7. Siki_Unity_1-2_Unity5.2入门课程_进入Unity开发的奇幻世界_Roll A Ball

    1-2 Unity5.2入门课程 进入Unity开发的奇幻世界 任务1:Roll A Ball项目简介 Unity官网的tutorial入门项目 方向键控制小球在平台上滚动,碰撞方块得分,消掉所有方块 ...

  8. Java学习 · 初识 容器和数据结构

    容器和数据结构 1.   集合的引入 a)     集合的使用场景:需要将一些相同结构的个体整合到一起时 i.           新闻列表 ii.           邮件列表 iii.       ...

  9. js如何判断客户端是iOS还是Android等移动终端

    判断原理:JavaScript是前端开发的主要语言,我们可以通过编写JavaScript程序来判断浏览器的类型及版本.JavaScript判断浏览器类型一般有两种办法,一种是根据各种浏览器独有的属性来 ...

  10. Quartz定时器原理与使用

    Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,是一个完全由java编写的开源作业调度框架. Quartz可以用来创建简单或为运行十个,百个,甚至是好几 ...