《关于我学习OC——日期与时间这件事》

日期与时间(Date&Time)

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

日期与时间(NSDate)

类方法[NSDate date]获取代表当前日期时间的NSDate
获取从当前时间开始,一天之后的日期
[[NSDate alloc] initWithTimeIntervalSinceNow: 3600*24];
initWithTimeIntervalSinceNow:从现在开始用时间间隔初始化
大量以init开头的方法来初始化NSDate对象
第一个:- (id)initWithTimeIntervalSinceNow:(NSTimeInterval)seconds
以当前时间的偏移秒数来初始化,也可以直接调用类方法 + (id)dateWithTimeIntervalSinceNow:(NSTimeInterval)seconds
第二个:获取从1970年1月1日开始的日期
初始时间为:Thu Jan 1 08:00:00 1970
第三个:initWithTimeInterval 加入秒再加日期
在这里插入图片描述

NSLocale* cn = [NSLocale currentLocale];
//current当前的,locale场所,发生地,地点
//获取NSdate在当前locale下对应的字符串
NSLog(@"%@", [date1 descriptionWithLocale:cn]);
//description with locale 当前地点的描述(日期格式以及文字都会变成中国的标准时间)

在这里插入图片描述
在这里插入图片描述
获取两个日期中,较为早/晚的日期
NSDate* earlier/later = [date1 earlier/laterDate:date2];
获取两个时间之间的时间差
NSLog(@“%g”, [date1 timeIntervalSinceDate:date2]);
[- (NSTimeInterval)timeIntervalSinceNow]
返回当前对象时间与客户端时间的相隔秒数,也可以这样理解:从客户端当前时间开始,经过多少秒到达对象指定时间。
从上面的代码可以看出,创建NSDate的类方法与实例方法基本类似,只是类方法以date开头而实例方法以init开头。一旦得到NSDate对象,两个NSDate之间就可以比较大小,可以计算两个NSDate之间的时间差,也可以把NSDate转换为符合当前NSLocale的格式字符串。

日期格式器(NSDateFormatter)

功能可以完成NSDate与NSString之间的转换

  1. 创建一个NSDateFormatter对象
  2. 调用NSDateFormatter的setDateStyle:,setTimeStyle:方法设置格式化日期,时间的风格。

其中,日期,时间风格支持如下几个枚举值。

NSDateFormatterNoStyle:不显示日期,时间的风格。

NSDateFormatterShortStyle:显示短的日期,时间风格

NSDateFormatterMediumStyle:显示中等的日期,时间风格

NSDateFormatterLongStyle:显示长的日期,时间风格

NSDateFormatterFullStyle:显示完整的日期,时间风格

如果打算使用自定义的格式模版,可以调用NSDateFormatter的setDateFormatter方法,设置日期,时间的模版即可。

  1. 如果需要将NSDate转换为NSString,调用NSDateFormatter的stringFromDate:方法执行格式化即可;

如果需要将NSString转换为NSDate,调用NSDateFormatter的dateFromString方法,执行格式化即可。

如下程序示范来NSDateFormatter的功能和用法.

#import <Foundation/Foundation.h>
 
int main(int argc, const char * argv[])
{
 
    @autoreleasepool {
        
        //需要被格式化的时间为从1970年1.1开始,20年后的日期
        NSDate* dt = [NSDate dateWithTimeIntervalSince1970:20*366*24*3600];
        //创建两个NSLocale,分别代表中国,美国
        NSLocale* locales[] = {[[NSLocale alloc] initWithLocaleIdentifier:@"zh_CN"],
                                [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]};
        NSDateFormatter* df[8];
        //为上面两个NSLocale创建8个DateFormat对象
        for (int i=0; i<2; i++) {
            df[i * 4] = [[NSDateFormatter alloc] init];
            //设置NSDateFormatter的日期,时间风格
            [df[i * 4] setDateStyle:NSDateFormatterShortStyle];
            [df[i * 4] setTimeStyle:NSDateFormatterShortStyle];
            //设置NSDateFormatter的NSLocale
            [df[i * 4] setLocale:locales[i]];
            
            df[i * 4 + 1] = [[NSDateFormatter alloc] init];
            //设置NSDateFormatter的日期,时间风格
            [df[i * 4 + 1] setDateStyle:NSDateFormatterMediumStyle];
            [df[i * 4 + 1] setTimeStyle:NSDateFormatterMediumStyle];
            //设置NSDateFormatter的NSLocale
            [df[i * 4 + 1] setLocale:locales[i]];
            
            df[i * 4 + 2] = [[NSDateFormatter alloc] init];
            //设置NSDateFormatter的日期,时间风格
            [df[i * 4 + 2] setDateStyle:NSDateFormatterLongStyle];
            [df[i * 4 + 2] setTimeStyle:NSDateFormatterLongStyle];
            //设置NSDateFormatter的NSLocale
            [df[i * 4 + 2] setLocale:locales[i]];
            
            df[i * 4 + 3] = [[NSDateFormatter alloc] init];
            //设置NSDateFormatter的日期,时间风格
            [df[i * 4 + 3] setDateStyle:NSDateFormatterFullStyle];
            [df[i * 4 + 3] setTimeStyle:NSDateFormatterFullStyle];
            //设置NSDateFormatter的NSLocale
            [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(@"MEDIUM格式的日期格式:%@",[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 = @"2013-03-12";
        NSDateFormatter* df3 = [[NSDateFormatter alloc] init];
        //根据日期字符串的格式设置格式模版
        [df3 setDateFormat:@"yyyy-MM-dd"];
        //将字符串转换为NSDate对象
        NSDate* date2 = [df3 dateFromString:dateStr];
        NSLog(@"%@",date2);  
     }
    return 0;
}

日历(NSCalendar)与日期组件(NSDateComponents)

日历(NSCalendar)

程序提供了3个输入框,用于分别输入年、月、日的数值,接下来需要将年、月、日数值转换为NSDate
得到一个NSDate 对象后,程序需要获取该NSDate 中包含的年份、月份、第几日。这些都需要将NSDate的各个字段数值分开提取。为了能分开处理NSDate 对象所包含的各个字段的数据,Foundation 框架提供了NSCalendar 对象。
两种常用方法

1.(NSDateComponents*)components:fromDate:
从NSDate中提取年,月,日时,分,秒各时间字段的信息
2.dataFromComponents:(NSDateComponents*)comps:
使用comps对象包含的年月日时分秒各时间字段的信息来创建NSDate

NSDateComponents对象用于封装年月日时分秒等各个字段的信息
从NSDate对象中获取各时间字段的数值步骤如下:
● 创建NSCalendar对象
● 调用NSCalendar的components:fromDate:方法来获取NSDate对象中的各时间字段的数值,该方法返回一个NSDateCoponents对象
● 调用NSDateComponents对象的getter方法来获取各时间字段的数值
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

#import<Foundation/Foundation.h>

int main(int argc, char* argv[])
{
    @autoreleasepool {
        NSCalendar* gregorian=[[NSCalendar alloc]
    initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
        NSDate* dt=[NSDate date];
        unsigned unitFlags=NSCalendarUnitYear|
        NSCalendarUnitMonth |NSCalendarUnitDay |
        NSCalendarUnitHour  |NSCalendarUnitMinute|
        NSCalendarUnitSecond |NSCalendarUnitWeekday;
        NSDateComponents* comp=[gregorian components: unitFlags
                                            fromDate:dt];
        NSLog(@"现在是%ld年",comp.year);
        NSLog(@"现在是%ld月",comp.month);
        NSLog(@"现在是%ld日",comp.day);
        NSLog(@"现在是%ld时",comp.hour);
        NSLog(@"现在是%ld分",comp.minute);
        NSLog(@"现在是%ld秒",comp.second);
        NSLog(@"现在是%ld星期",comp.weekday);
        NSDateComponents* comp2=[[NSDateComponents alloc]init];
        comp2.year=2022;
        comp2.month=5;
        comp2.day=29;
        comp2.hour =3;
        comp2.minute=34;
        NSDate* date=[gregorian dateFromComponents:comp2];
        NSLog(@"获取的日期为:%@",date);
        
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值