前言
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)
//
// 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 方法来获取各时间字段的数值。
①创建 NSCalendar 对象。
② 创建一个 NSDateComponents 对象,调用该对象的 setter 方法来设置各时间字段的数值.
③调用 NSCalendar 的dateFromComponents: (NSDateComponents*)方法初始化 NSDate 对
象该方法将会返回一个 NSDate 对象。
四、定时器
如果我们的程序需要让某个方法重复执行,可以借助OC的计时器来完成。
具体步骤如下:
timeInterval:每隔多少秒执行一次任务
invocation 或 target与selector :制定重复执行的任务。如果指定target与selector参数,则指定用某个对象的特定方法作为重复执行的任务;如果指定invocation参数,则该参数需要换入一个NSInvocation对象,其中NS Invocation对象也是封装target与selector的,其实也是指定用某个特定方法作为重复执行的任务。
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进行投诉反馈,一经查实,立即删除!