OC_07_时间类与类的扩展

来源:互联网 发布:淘宝卖鞋子店铺名字 编辑:程序博客网 时间:2024/06/09 20:15


NSDate

NSDateCocoa中用于处理日期和时间的基础类,封装了某一给定的

时刻(含日期,时间,时区)。使用+date方法获取当前时间

例如:NSDate *nowDate = [NSDate date];

注意NSLog(@“%@”,nowDate);无论你是哪个时区的时间,打印时总是打印对应的0时区时间。 


    //时间类

   NSDate *date = [[NSDatealloc]init];

    

    NSDate *d = [NSDatedate];

    //alloc + date获取当前时间,无论在哪个时区,总是会打印相应的0时区的时间

    

   NSLog(@"%@", d);//

    

    //获取当前的时区

    NSTimeZone *zone = [NSTimeZonesystemTimeZone];

   NSLog(@"%@", zone);


    //根据对应的时区,获取和0时区相差的秒数

    NSInteger seconds = [zonesecondsFromGMTForDate:date];

   NSLog(@"%ld",seconds);

    

    NSDate *local1Date = [NSDatedateWithTimeIntervalSinceNow:8 * 3600];

    

   NSDate *localDate = [NSDatedateWithTimeIntervalSinceNow:24*3600 + 8*3600.5];

   NSLog(@"%@", localDate);

    //sinceNow:0,还是0时区的时间

    //时间间隔是double,也可以传一个小数,以秒为单位


NSTimeInterval

NSTimeInterval(即double类型) 用以表示以秒为单位的时间间隔

可以使用-initWithTimeIntervalSinceNow:方法传入一个NSTimeInterval参数,创建一个NSDate对象

例如:NSDate * tomorrowDate = [[NSDate alloc] initWithTimeIntervalSinceNow:24*60* 60];

NSDate * yesterdayDate = [[NSDate alloc] initWithTimeIntervalSinceNow:-1 * 24*60*60];

取两个时间对象的间隔:NSTimeinterval = [tomorrowDatetimeIntervalSinceDate:yesterdayDate]; 


//获取明天的时间

    NSDate *tomorroewDate = [NSDatedateWithTimeIntervalSinceNow:32 * 3600];

   NSLog(@"%@", tomorroewDate);

    

    NSDate *yesterdayDate = [NSDatedateWithTimeIntervalSinceNow:-16 *3600];

    

    //1970年的时间

    NSDate *date1970 = [NSDatedateWithTimeIntervalSince1970:0];

   NSLog(@"%@", date1970);

    

    NSDate *newDate = [NSDatedateWithTimeIntervalSinceNow:12345];

   NSLog(@"%@", newDate);

    //两个时间的时间间隔

   NSTimeInterval timeNow = [local1Date timeIntervalSinceDate:newDate];

   NSLog(@"%g", timeNow);


NSDateFormatter 

NSDateFormatteriOS中的日期格式类,功能是实现NSStringNSDate的互转。

常见的时间格式化字符串有以下一些:y年、M年中的月份 、d月份中的天数、H一天中的小时数(0-23)h am/pm 中的小时数(1-12)m小时中的分钟数 、s分钟中的秒数 

指定日期格式: NSDateFormatter * formatter = [[NSDateFormatter alloc] init];[formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; 


   //设置时间的格式,完成NSDateNSstring的互相转换

    //date->字符串的第一种方式

   NSDate *date = [NSDatedate];

    NSString *dateStr1 = [NSStringstringWithFormat:@"%@",date];

    NSString *dateStr2 = [[NSStringalloc]initWithFormat:@"%@",date];

   NSLog(@"%@, %@", dateStr1, dateStr2);

    

    //第二种,根据对应的时间格式进行转换

    NSDateFormatter *formatter = [[NSDateFormatteralloc]init];

    //设置时间格式

    // y  M  d  h 小时(12小时制), H 24小时制 m分钟 s

    [formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];

   NSString *formatterStr = [formatterstringFromDate:date];

   NSLog(@"%@", formatterStr);

    // formatter来转化的话能自动切换时区,并且能把时差的+0000去掉

    

    //NSString -> NSDate

    NSString *dateString =@"2015-06-7 02:45:00";

    //创建一个时间格式,并且格式和字符串内的时间格式完全相同

    NSDateFormatter *forMatter1 = [[NSDateFormatteralloc]init];

    [forMatter1 setDateFormat:@"yyyy-MM-dd HH:mm:ss"];

   NSDate *date1 = [formatterdateFromString:dateString];

   NSLog(@"%@",date1);

    //转换之后的时间和我们指定的时间差了8个小时,还需要加上8个小时才能正常使用

    


NSDate转NSString

日期转化为字符串: NSDateFormatter*formatter =[[NSDateFormatter alloc] init];

[formatter setDateFormat:@"yyyy-MM-dd hh:mm:ss"];

NSString *dateString=[formatter stringFromDate: [NSDate date]]; 


NSString转NSDate

时间字符串转化为相对应的日期:NSDateFormatter * formatter =[[NSDateFormatter alloc] init];

[formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];

NSString * dateStr = @”2008-08-08 20:08:08”;NSDate * date = [formatter dateFromString:dateStr]; 


类的扩展

一,类目(Category )

主要作用是为没有源代码的类添加方法。

通过Category添加的方法会成为原类的一部分。从而达到扩展一个类的功能。

类目分为两种,一种是系统的类目,它主要是为了给类的方法进行系统的分类,把相同,相似的方法放在一起,方便寻找

另外一种是自己写的类目,自己写的类目是对原有的类进行功能的扩展,一般就是把原有类的方法进行重新组合,产生一个新的方法


创建,cmd+n-> OS X -> Source -> Objective-C File,然后起名, File Type选择Category, Class选择要扩展的类

.h

@interface NSDate (StringToDate)

+ (NSDate *)stringToDate:(NSString *)str;

@end


.m

@implementation NSDate (StringToDate)

+ (NSDate *)stringToDate:(NSString *)str

{

    //创建一个日期的格式

    NSDateFormatter *formatter = [[NSDateFormatteralloc]init];

    //设置日期格式

   [formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];

    

   NSDate *date = [formatterdateFromString:str];

    

 NSDate *newDate = [datedateByAddingTimeInterval:8 * 3600];

    

   return newDate;

}

@end


Extension

Extension的主要作用是管理类的私有方法。

 面向对象编程也叫面向接口编程。

在设计一个类的时候,有些方法需要对外公开(我们称为接口),有些方法仅内部使用(比如:是某个方法的一个小步骤)。

Extension的功能是帮我们去管理这些内部使用的方法(私有方法)。 


Extension的语法格式和Category很相似

相当于把Category.h⽂文件挪到了原始类的.m文件中

Extension针对的是自己的类,必须有源代码的类 

而类目可以不需要源码对类进行扩展


.m

//类的延展

@interface Student ()

//在延展里写一个属性

@property (nonatomic,copy)NSString *stuSex;


@end


@implementation Student


- (void)test

{

   _stuSex =@"5";

}


@end


protocol

Protocol(协议),是iOS开发中常用的技术。

协议是一套标准(一堆方法的声明),只有.h⽂文件。就像一张任务清单(或便利贴),上面写了一堆需要处理的事。清单交给谁,谁就要去完成清单上规定的任务。

 接受协议的对象实现协议中定义的方法。即:清单交给谁,谁就要去完成清单上规定的任务。

协议中的方法默认是必须实现的,即@required。关键字@optional 修饰的方法是可选的,可实现也可不实现。 

Protocol的核心使用场景是实现delegate设计模式。

delegate(代理)。通俗的讲就是代理商,主要的任务是帮你完成一些任务。

比如:保姆就可以认为是delegate,主要的任务是帮你带孩子、做饭、洗衣服等。 

例:结婚,我们先创建girl和boy两个类

girl.h

// 协议第一步:准备一份协议,声明一份协议

@protocol Marry <NSObject>

//协议里方法有两种,一种是必须执行的方法,另一种是可选择的方法

//方法默认是必须实现的

@required

- (void)makeMoney;

@optional

- (void)wash;

@end

//协议在interface上边

@interface Girl : NSObject

//协议的第二步:设置代理人的属性

@property (nonatomic,assign)id<Marry> delegate;

// 两人结婚了

- (void)getMarried;

@end


girl.m

@implementation Girl

- (void)getMarried

{

    NSLog(@"他们终于结婚了");

    //协议第三步:让代理人去执行方法

    [self.delegatemakeMoney];

}

@end


boy.h

#import "Girl.h"

//协议第四步:签订协议

@interface Boy : NSObject<Marry>

@end


boy.m

@implementation Boy

// 协议第六步:实现对应的协议方法

- (void)makeMoney

{

   NSLog(@"买买买");

}

@end


main

Girl *g = [[Girl alloc] init];

   Boy *b = [[Boyalloc] init];

    //协议第五步:设置代理人

    g.delegate = b;

    //调用结婚的方法

    [g getMarried];


    协议就是让别人(代理人)去完成自己的方法

    1.girl.h,声明一份协议

    2.girl.h,设置代理人属性

    3.girl.m,设置让代理人执行方法

    4.boy.h,签订协议

    5.main.m,设置代理人

    6.boy.m 实现协议的方法


总结:

NSDateiOS中表示日期的类。可以使用NSDateFormatter控制

NSStringNSDate的互转

Category能为没有源代码的类添加方法

Extension为类管理私有方法

Protocoldelegate通常联合使用,是iOS开发中特别常用。 




 



1 0