博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Foundation框架—时间处理对象NSDate
阅读量:4969 次
发布时间:2019-06-12

本文共 8044 字,大约阅读时间需要 26 分钟。

  

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的基本使用

1 //        获取时间 2         NSDate *date = [NSDate date]; 3         NSLog(@"国际标准时间:%@",date); 4 //        获取系统当前时区 5         NSTimeZone *zone = [NSTimeZone systemTimeZone];//中国位于东八区、与国际标准时间相差8小时 6 //      获取当前时区与格林尼治时间的间隔 7         NSTimeInterval ti  = [zone secondsFromGMTForDate:date]; 8 //获取本地时间 9         NSDate *localDate = [NSDate dateWithTimeIntervalSinceNow:ti];10         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];//+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:60*60*24];//    //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:60*60*24];// 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);

 

 

转载于:https://www.cnblogs.com/LifeTechnologySupporter/p/4846527.html

你可能感兴趣的文章
数据模型(LP32 ILP32 LP64 LLP64 ILP64 )
查看>>
java小技巧
查看>>
POJ 3204 Ikki's Story I - Road Reconstruction
查看>>
【BZOJ】2959: 长跑(lct+缩点)(暂时弃坑)
查看>>
iOS 加载图片选择imageNamed 方法还是 imageWithContentsOfFile?
查看>>
toad for oracle中文显示乱码
查看>>
SQL中Group By的使用
查看>>
错误org/aopalliance/intercept/MethodInterceptor解决方法
查看>>
两个表格中数据不用是一一对应关系--来筛选不同数据,或者相同数据
查看>>
Strict Standards: Only variables should be passed by reference
查看>>
hiho_offer收割18_题解报告_差第四题
查看>>
AngularJs表单验证
查看>>
静态方法是否属于线程安全
查看>>
02号团队-团队任务3:每日立会(2018-12-05)
查看>>
SQLite移植手记1
查看>>
js05-DOM对象二
查看>>
mariadb BINLOG_FORMAT = STATEMENT 异常
查看>>
C3P0 WARN: Establishing SSL connection without server's identity verification is not recommended
查看>>
iPhone在日本最牛,在中国输得最慘
查看>>
动态方法决议 和 消息转发
查看>>