前言

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

一、日期时间(NSData)

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

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

#import <Foundation/Foundation.h&gt;

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对象中分开获取各时间字段数值的方法如下

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

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

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

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

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

四、定时器

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

原文地址:https://blog.csdn.net/weixin_72437555/article/details/130375671

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_36578.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注