黑马程序员——Foundation框架入门:NSNumber,NSValue和NSDate

———-android培训、Java培训、iOS培训,期待与您交流———-

一、NSNumber

用途:把基本数据类型的数据保存到NSArray或NSDictionary中。

赋值

int a = 10;
NSNumber *a1 = [NSNumbernumberWithInt:a];//这样就可以向NSArray中添加数值变量了:
NSMutableArray *arr = [NSMutableArray arrayWithObject:a1];

除了上面的基本方法外还有两个快速赋值的方法:

1.NSNumber *a3 = @(a);//将变量a赋值给a3

2.NSNumber *a4 = @10;//将变量a赋值给a4

取值

接上例:

NSNumber *a2 = arr[0];
[a2 intValue]; //如果是float类型的变量,则使用floatValue:
[a2 floatValue];//其他数据类型相似。 

二、NSValue

NSValue包装对象指针,CGRect结构体等。一个NSValue对象是用来存储一个C或者Objective-C数据的简单容器。它可以保存任意类型的数据,比如int,float,char,当然也可以是指pointers, structures, and object ids。NSValue类的目标就是允许以上数据类型的数据结构能够被添加到集合里,例如那些需要其元素是对象的数据结构,如NSArray或者NSSet的实例。需要注意的是NSValue对象是不可枚举的。 简单来说,NSValue就是用来将不是对象的数据转换为对象,从而使得这些数据可以被存储在NSArray、NSDictionary等数据结合中。

赋值

OC提供了多种不同数据复制到NSValue型变量的方法。例如:

NSValue *v1 = [NSValue valueWithPoint:c1];//c1是已经定义的CGPointer结构体变量

类似的还有:

+(NSValue *)valueWithPoint:(NSPoint)point;
+(NSValue *)valueWithSize:(NSSize)size; 
+(NSValue *)valueWithRect:(NSRect)rect; 

等。

取值

NSPoint p1 = [v1 pointValue];

同样还有sizeValue、rectValue方法。

将自定义结构体转换为NSValue类型

typedef struct d{
    int year;
    int month;
    int day;
} MyDate;
MyDate d1 = {2015,8,31};
NSValue *val = [NSValue valueWithBytes:&d1 objCType:@encode(MyDate)];//@encode(aType)返回一个该类型的C字符串

取出存入NSValue中的自定义结构体的值

接上例

MyDate md;//由于接收从NSValue转回MyDate的数据
[val getValue:&md];
NSLog(@"%d %d%d",md.year,md.month,md.day);

三、NSDate

显示时间:

NSDate *d = [NSDate date];
NSLog(@"%@",d);//使用这种方法显示的是格林威治时间,而不是本地时间

如果要显示本地时间,需要使用如下方法:

NSDate *d = [NSDate date];
NSTimeZone *zone = [NSTimeZone systemTimeZone]; //设置时区为当前系统时区
NSInteger interval =[zone secondsFromGMTForDate: d]; //获取当前时区和0时区的时间间隔
NSDate *localeDate = [d dateByAddingTimeInterval:interval]; //重新生成时间
NSLog(@"%@",localeDate);

格式化时间

想让系统输出的时间按照需要的格式呈现就需要格式化时间,方法如下:

NSDateFormatter *fmt = [NSDateFormatter new];//定义一个格式化对象,用于保存格式
fmt.dateFormat = @"yyyy年MM月dd日HH:mm:ss";//具体格式
NSString *dateStr = [fmt stringFromDate:d];//将当前时间以已经定义好的格式转换为NSString对象
NSLog(@"%@",dateStr);

在编写时间格式时不必包括时间的每一个部分,可以只有年月没有日等。

格式化的字母含义:

  • yyyy-四位年份

  • MM-两位月份

  • dd-两位日期

  • HH-两位小时数(24小时制)

  • hh-两位小时数(12小时制)

  • mm-两位分钟数

  • ss-两位秒数

计算时间

获取明天这个时候的时间,接上例:

NSTimeInterval inter = 60*60*24;//一天的秒数
NSDate *tmr = [NSDate dateWithTimeIntervalSinceNow:inter];
dateStr = [fmt stringFromDate:tmr];
NSLog(@"%@",dateStr);

获取昨天这个时候的时间,接上例:

tmr = [NSDate dateWithTimeIntervalSinceNow:-inter];

这是取巧的方法,取时间差的负值即可。

日期时间对象NSCalendar

单独获取某个时间

使用NSCalendar可以快速获取部分日期时间,例如年或秒。

NSDate *d = [NSDate date];
NSCalendar *cal = [NSCalendar currentCalendar];
NSDateComponents *com = [cal components:NSCalendarUnitYear|NSCalendarUnitMinute fromDate:d];//可以通过添加竖线|添加更多的时间单元
NSLog(@"%ld%ld",com.year,com.minute);
计算两个时间点的时间差
NSString *time1 = @"2015-08-21 20:21:22";
NSString *time2 = @"2015-09-02 13:21:02";//设定两个时间点

NSDateFormatter *fmt = [NSDateFormatter new];
fmt.dateFormat = @"yyyy-MM-ddHH:mm:ss";//格式化时间

NSDate *d1 = [fmt dateFromString:time1];
NSDate *d2 = [fmt dateFromString:time2];//将设定的两个时间点的NSString对象转换为NSDate对象

NSCalendar *cal = [NSCalendar currentCalendar];
int unit = NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay|NSCalendarUnitHour|NSCalendarUnitMinute|NSCalendarUnitSecond;//通过整形变量保存当前时间的具体每个部分

NSDateComponents *com = [cal components:unit fromDate:d1toDate:d2 options:0];

NSLog(@"相差%ld年%ld月%ld天%ld小时%ld分钟%ld秒钟",com.year,com.month,com.day,com.hour,com.minute,com.second);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值