Objc-C 知识点回顾 八 NSDate、 Extension、Category、Delegate

1.NSDate:日期类
        NSDate *date = [NSDate date];
        NSLog(@"%@", date); //默认是0时区 ,获得东八区相差8小时
        //格式:年-月-日 时:分:秒 时区
       
        //NSTimeInterval: 时间的计算单位, 秒, 实质是double
        //一分钟以后
        NSDate *date1 = [NSDate dateWithTimeIntervalSinceNow:60];
        NSLog(@"%@", date1);
       
        //昨天的现在时刻
        NSDate *date2 = [NSDate dateWithTimeIntervalSinceNow:-24 * 60 * 60];
        NSLog(@"%@", date2);
        //明年的现在时刻
        NSDate *date3 = [NSDate dateWithTimeIntervalSinceNow:366 * 24 * 60 * 60];
        NSLog(@"%@", date3);
       
        //昨天的现在时刻 与 明年的现在时刻 间隔多少秒
        NSTimeInterval seconds = [date2 timeIntervalSinceDate:date3];//前面的时间 - 后面的时间
        NSLog(@"%.2lf", seconds);
       
        //现在时刻 与 1970年1月1日 间隔多少秒(时间戳)
        NSTimeInterval interval = [date timeIntervalSince1970];
        NSLog(@"%lf", interval);
       
        //时间戳:某一时刻距离1970年1月1日的秒数
        //时间戳转日期
        NSTimeInterval interval1 = 1425956499;
        NSDate *date4 = [NSDate dateWithTimeIntervalSince1970:interval1];
        NSLog(@"%@", date4);
       
        //做一个练习,计算当前时间和一个固定时间的差值,如果差值在60秒内,输出“刚刚”,如果在60秒外3600秒内,输出“xx分钟前”,如果3600秒外,3600*24秒内,输出“xx小时前”。
        //当前时间
        NSDate *nowDate = [NSDate date];
        //固定时间
        NSDate *aDate = [nowDate dateByAddingTimeInterval:3600];
        //当前时间和固定时间的间隔
        NSTimeInterval time = [aDate timeIntervalSinceDate:nowDate];
        if (time < 60) {
            NSLog(@"刚刚");
        } else if (time < 3600 ) {
            NSLog(@"%d分钟前", (int)time / 60);
        } else if (time < 3600 *24 ) {
            NSLog(@"%d小时前", (int)time / 3600);
        } else {
            NSLog(@"%@", nowDate);
        }

2.NSDateFormatter: 日期格式类
        NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
        //设置日期格式
        //yyyy, YYYY: 四位年份
        //yy, YY: 两位年份
        //MM: 两位月份, 不足补0
        //M: 一位月份
        //注: 月份必须大写
        //dd: 两位日期, 不足补0
        //d: 一位日期
        //注意: 日期必须小写, 大写表示当前日期为一年的第几天
        //hh: 两位12进制小时, 不足补0
        //h: 一位12小时进制
        //HH: 两位24进制小时, 不足补0
        //H: 一位24小时进制
        //mm: 两位分钟,不足补0
        //m: 一位分钟
        //注: 分钟必须小写
        //ss: 两位秒数, 不足补0
        //s: 一位秒数
        //注: 秒数必须小写
       
        [formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
// **将NSDate 转化成 NSString
    // 1 系统给定的格式
    // 实例化NSDateformatter对象
    NSDateFormatter *formatter1 = [[NSDateFormatter alloc] init];
    // 设置格式
    [formatter1 setDateStyle:NSDateFormatterFullStyle]; // 格式可以自己选择
    //将date转化成字符串
    NSLog(@"%@",[formatter1 stringFromDate:[NSDate date]]);
    // 2 自定义格式
    // 实例化 对象
    NSDateFormatter *formatter2 = [[NSDateFormatter alloc] init];
    [formatter2 setDateFormat:@"yyyy年MM月dd HH:mm:ss"]; //自定义格式
    NSString *strDate2 = [formatter2 stringFromDate:[NSDate date]];
    NSLog(@"%@",strDate2);
    // **NSString 转化成 NSDate
    NSDate *dateFromStr = [formatter2 dateFromString:@"2011-09-12 20:30:45"];
NSLog(@"%@",dateFromStr); //打印的时候默认0时区

3.NSTimeZone: 时区类
        //设置时区
       //NSTimeZone *timeZone = [NSTimeZone timeZoneWithName:@"china"];//cn, beijing
        NSTimeZone *timeZone = [NSTimeZone timeZoneForSecondsFromGMT:8 * 60 * 60];
       
        [formatter setTimeZone:timeZone];
        //把某一时刻的日期, 按照规定好的格式, 转换成字符串
        NSString *string = [formatter stringFromDate:[NSDate date]];
        NSLog(@"%@", string);
        //将字符串@“2014年05月01日 10点23分18秒”转换为NSDate对象。
        NSString *dateString = @"2014年05月01日 10点23分18秒";
       
        NSDateFormatter *formatter1 = [[NSDateFormatter alloc] init];
        [formatter1 setDateFormat:@"yyyy年MM月dd日 HH点mm分ss秒"];
        [formatter1 setTimeZone:[NSTimeZone timeZoneWithName:@"GMT"]];
        NSDate *newDate = [formatter1 dateFromString:@"2014年05月01日 10点23分18秒"];
        NSLog(@"%@", newDate);

4.类的扩充
        //(1)对于已知类(可以查看.m文件)进行扩充
        //修改类的源文件
        Pen *pen = [[Pen alloc] init];
        [pen draw];
       
        //(2)对于未知类(不能查看.m文件)继续扩充
        //a.继承(子类化), 子类重写父类的方法, 扩充自己的方法
        Pencil *pencil = [[Pencil alloc] init];
        [pencil draw];
        [pencil write];
       
        //b.Category: 分类, 类目
        //文件名: 类名 + 分类名.h, 类名 + 分类名.m
        [NSString helloWorld];
       
        //使用分类为未知类进行扩充的步骤
        //(1)新建文件
        //(2)选择Objective-C file模板
        //(3)填写分类名, 选择Category, 选择要扩充的类
        //(4)在.h中写方法声明, 在.m中写方法实现
        //(5)引入头文件, 使用扩充方法


#import <Foundation/Foundation.h>
@interface NSDate (YYDate)
//字符串转化成Date (参数:设置格式的字符串 ,时间字符串)
+(NSDate *)dateFormFormatStr:(NSString *)formatStr
                     timeStr:(NSString *)timeStr;
+(NSString *)stringFormDate:(NSString *)date
                   timeDate:(NSDate *)timeDate;
@end
#import "NSDate+YYDate.h"

@implementation NSDate (YYDate)
+(NSDate *)dateFormFormatStr:(NSString *)formatStr
                     timeStr:(NSString *)timeStr
{
    //实例化一个NSDateFormatter对象
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    // 设置formatter格式
    [formatter setDateFormat:formatStr];//外界传送过来
    // formatter执行方法
    return  [formatter dateFromString:timeStr];
}
+(NSString *)stringFormDate:(NSString *)date
                      timeDate:(NSDate *)timeDate
{
    NSDateFormatter *formatter1 = [[NSDateFormatter alloc] init];
    [formatter1 setDateFormat:date];
    //formatter 执行方法(将要转化的字符串按照 formatter格式进行转化为date对象返回)
    return [formatter1 stringFromDate:timeDate];
}
@end
//使用NSDate类目里的方法将字符串转换成date并返回
    NSDate *date2 = [NSDate dateFormFormatStr:@"yyyy-MM-dd HH-mm-ss" timeStr:@"2012-05-23 12-34-45"];
    NSLog(@"%@",date2);
    //使用NSDate类目里的方法将date换转成字符串并返回
    NSString *Str2 = [NSDate stringFormDate:@"yyyy-MM-dd HH-mm-ss" timeDate:[NSDate date]]; //默认现在时区
    NSLog(@"%@",Str2);
        //1.一般用于对系统类进行扩充方法
        //2.分类中不能添加实例变量
       
        //做个练习, 使用分类的方式, 为Pen扩充一个sayHi方法
        [Pen sayHi]
        
        //Extension: 延展, 为类扩充私有方法声明, 实例变量
        //文件: 类名_延展名.h
       
        //延展的两种写法
        //(1)通过模板创建.h, 然后在类的.m中引用
        //注;这种写法的弊端, 如果你把.h引用到其他文件, 在其他文件中也可以调用私有方法
       
        //(2)直接在.m中写, 写法
        //@interfance 类名() {
        //实例变量
        //}
        //   私有方法声明
        //@end
       
        //Protocol: 协议
        //遵守协议用<>, 写在@interfance, 父类名的后面
        Boy *boy = [[Boy alloc] init];
        [boy buyFood];
        [boy buyiPhone];
       
        //delegate: 代理
       
        //步骤
        //找代理的类
        //(1)制定协议
        //(2)添加实例变量
        //(3)为实例变量写setter方法
       
        //想要成为代理的类
        //(1)遵守协议
        //(2)实现协议中必须实现的方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值