【OC】日期与时间


前言

OC为处理时间,处理日期提供了NSData、NSCalendar对象,还提供了日期格式器来处理日期与字符串的转换。

一、日期与时间(NSData)

NSData对象代表日期与时间,OC既提供了类方法来创建NSData对象,也提供了大量以init开头的方法来初始化NSData对象。

//
//  main.m
//  日期与时间
//
//  Created by 夏楠 on 2023/4/25.
//

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    
    
    @autoreleasepool {
    
    
        NSDate *data1 = [NSDate date];
        NSDate *data2 = [[NSDate alloc] initWithTimeIntervalSinceNow:3600 * 24];
        //获得后一天的时间
        NSLog(@"%@", data1);
        NSLog(@"%@", data2);
        NSDate *data3 = [[NSDate alloc] initWithTimeIntervalSinceNow:-3 * 3600 * 24];
        //获得三天前的日期
        NSLog(@"%@", data3);
//        NSDate *data4 = [[NSDate alloc] initWithTimeIntervalSince1970:3600 * 24 * 366 * 30];
//        NSLog(@"%@", data4);//获得1970一月一日之后30年的日期
        NSLocale* cn = [NSLocale currentLocale];
        // 获取NSdate
        NSLog(@"%@", [data1 descriptionWithLocale:cn]);
        //将data1赋给cn,获得当前地区的时间
        //获取系统当前的locale
//        NSLocale *cn1 = [NSLocale currentLocale];
//        NSLog(@"%@", cn1);
        //获取NSdata在当前locale下对应的字符串
        NSLog(@"%@", [data1 descriptionWithLocale:cn]);
        //获取两个之间较早的
        NSLog(@"%@", [data1 earlierDate:data2]);
        
        //compare 方法返回NScomparisonResult枚举值
       // 枚举包含
        //NSOrderedAscending,NSOrderedSame, NSOrderedDescending
        // 分别代表了 调用compare 的日期位于被比较日期的之前 相同 之后
        switch ([data1 compare:data2]) {
    
    
            case NSOrderedSame:
                NSLog(@"date1 == date3");
            case NSOrderedAscending:
                NSLog(@"data1 在 data3 之前");
            case NSOrderedDescending:
                NSLog(@"data1 在 data3 之后");
        }
        NSLog(@"时间差为%g", [data1 timeIntervalSinceDate:data3]);
        //interval的意思是间隔,上述是data1 与 data3 的时间间隔
        NSLog(@"差为%g", [data2 timeIntervalSinceNow]);
        //与现在的时间间隔
        
        
    }
    return 0;
}

输出:
在这里插入图片描述

我们创建NSData的类方法与实例方法基本类似,只是类方法以data开头,实例方法以init开头。
一旦得到了NSData对象,两个NSData之间就可以比较大小,可以计算两个NSData之间的时间差,也可以吧NSData转换为符合当前NSLocale格式的字符串

二、日期格式器(NSDataFormatter)

在这里插入图片描述

我们在如下给出NSDataFormatter的功能与用法

//
//  main.m
//  日期格式器
//
//  Created by 夏楠 on 2023/4/27.
//

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    
    
    @autoreleasepool {
    
    
    //需要被格式化的时候
    //获取从1970一月一入开始二十年后的日期
        NSDate *dt = [NSDate dateWithTimeIntervalSince1970:3600 * 24 * 366 * 50];
    //创建两个NSLocale,分别代表中国和美国
        NSLocale *locales[] = {
    
    [[NSLocale alloc] initWithLocaleIdentifier:@"zh_CN"], [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]};
        NSDateFormatter *df[8];
        //为上面两个NSLocale创建8个DataFormat对象
        for (int i = 0; i < 2; i++) {
    
    
            df[i * 4] = [[NSDateFormatter alloc] init];
            //设置NSDataFormatter的日期、时间风格。
            [df[i * 4] setDateStyle:NSDateFormatterShortStyle];
            [df[i * 4] setTimeStyle:NSDateFormatterShortStyle];
            //设置NSDataFormatter的NSLocale 地区
            [df[i * 4] setLocale: locales[i]];
            df[i * 4 + 1] = [[NSDateFormatter alloc] init];
            [df[i * 4 + 1] setDateStyle:NSDateFormatterMediumStyle];
            [df[i * 4 + 1] setTimeStyle:NSDateFormatterMediumStyle];
            [df[i * 4 + 1] setLocale: locales[i]];
            df[i * 4 + 2] = [[NSDateFormatter alloc] init];
            [df[i * 4 + 2] setDateStyle:NSDateFormatterLongStyle];
            [df[i * 4 + 2] setTimeStyle:NSDateFormatterLongStyle];
            [df[i * 4 + 2] setLocale: locales[i]];
            df[i * 4 + 3] = [[NSDateFormatter alloc] init];
            [df[i * 4 + 3] setDateStyle:NSDateFormatterFullStyle];
            [df[i * 4 + 3] setTimeStyle:NSDateFormatterFullStyle];
            [df[i * 4 + 3] setLocale: locales[i]];
        }
        for (int i = 0 ;i < 2; i++) {
    
    
            switch (i) {
    
    
                case 0:
                    NSLog(@"华为日期格式");
                    break;
                case 1:
                    NSLog(@"洛杉矶日期格式");
                    break;
            }
            NSLog(@"short:%@", [df[i * 4] stringFromDate:dt]);
            NSLog(@"mid: %@", [df[i * 4 + 1] stringFromDate:dt]);
            NSLog(@"long:%@", [df[i * 4 + 2] stringFromDate:dt]);
            NSLog(@"full:%@", [df[i * 4 + 3] stringFromDate:dt]);
        }
        NSDateFormatter *df2 = [[NSDateFormatter alloc] init];
        //设置自定义的格式器模版
        [df2 setDateFormat:@"公园yyyy年MM月DD日HH时mm分"];
        //执行格式化
        NSLog(@"%@", [df2 stringFromDate:dt]);
        NSString *datestr = @"2023-11-17";
        NSDateFormatter *df3  = [[NSDateFormatter alloc] init];
        //根据日期字符串的格式设置格式模版
        [df3 setDateFormat:@"yyyy-MM-dd"];
        //将字符串转换为NSData对象
        NSDate *date2 = [df3 dateFromString:datestr];
        NSLog(@"%@", date2);
    }
    return 0;
}

输出:
在这里插入图片描述

这里要记得我们的自定义的格式器模版一定要严格按照yyMMDD这样的字母格式,要不然就会报错
在这里插入图片描述

三、日历与日期组件

因为此类的很多方法在如今的mac版本中其实已经被弃用,所以这里只讲述一下未被弃用的方法的原理。
我们使用这两个类的目的在于我们可以输入年月日,并且将数值转换为NSData,或者是我们需要得到NSData中的年月日。
我们为了分开处理NSData对象所包含的年月日的数据,foundation框架提供了NSCalendar对象,该对象包含一下常用的两个方法
在这里插入图片描述
从NSDate对象中分开获取各时间字段的数值的方法如下

扫描二维码关注公众号,回复: 15853719 查看本文章

①创建 NSCalendar 对象。
② 调用 NSCalendar 的 components: fromDate:方法获取 NSDate 对象中各时间字段的数值
该方法返回一个 NSDateComponents 对象。
③调用 NSDateComponents 对象的getter 方法来获取各时间字段的数值。

使用各时间字段的数值来初始化 NSDate 对象的步骤如下

①创建 NSCalendar 对象。
② 创建一个 NSDateComponents 对象,调用该对象的 setter 方法来设置各时间字段的数值.
③调用 NSCalendar 的dateFromComponents: (NSDateComponents*)方法初始化 NSDate 对
象该方法将会返回一个 NSDate 对象。

其实这二者有很多相似点,比如:

  1. 都先需要创建一个NSCalendar对象
  2. 调用对应的方法来获取或设置数值
  3. 然后按对应方式输出

四、定时器

如果我们的程序需要让某个方法重复执行,可以借助OC的计时器来完成。
具体步骤如下:
在这里插入图片描述
timeInterval:每隔多少秒执行一次任务
invocationtargetselector :制定重复执行的任务。如果指定target与selector参数,则指定用某个对象的特定方法作为重复执行的任务;如果指定invocation参数,则该参数需要换入一个NSInvocation对象,其中NS Invocation对象也是封装target与selector的,其实也是指定用某个特定方法作为重复执行的任务。
userInfo:该参数用于传入额外的附加信息。
repeats:该参数需要指定一个bool值,该参数控制是否需要重复执行任务
2. 为第一步的任务编写方法
3. 销毁定时器,调用定时器的invalidate方法即可
但其实具体使用笔者还不会用,后面会补充。

猜你喜欢

转载自blog.csdn.net/weixin_72437555/article/details/130375671