关于NSCalendar 日历的学习记录

这篇博客详细记录了对NSCalendar的学习过程,包括如何利用NSCalendar获取系统定义的不同日历类型,以及如何计算两个日期间的年月日差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

系统中定义的日历有:

NSString * const NSGregorianCalendar; 公历(常用)
NSString * const NSBuddhistCalendar; 佛教日历
NSString * const NSChineseCalendar; 中国农历(常用)
NSString * const NSHebrewCalendar; 希伯来日历
NSString * const NSIslamicCalendar; 伊斯兰历
NSString * const NSIslamicCivilCalendar; 伊斯兰教日历
NSString * const NSJapaneseCalendar; 日本日历(和历,常用)
NSString * const NSRepublicOfChinaCalendar; 中华民国日历(台湾)
NSString * const NSPersianCalendar; 波斯历
NSString * const NSIndianCalendar; 印度日历
NSString * const NSISO8601Calendar; ISO8601(但是现在还不可用)

得到某两个日期之间的年月日

NSDate *toDate = [NSDate dateWithTimeIntervalSince1970:0];
    
    NSDate*  startDate = [NSDate date];

    //设定为公历
    NSCalendar* chineseClendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    
    NSUInteger unitFlags = NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit | NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit;
    
    NSDateComponents *cps = [chineseClendar components:unitFlags fromDate:toDate  toDate:startDate  options:0];
    
    NSInteger diffHour = [cps hour];
    
    NSInteger diffMin = [cps minute];
    
    NSInteger diffSec = [cps second];
    
    NSInteger diffDay = [cps day];
    
    NSInteger diffMon = [cps month];
    
    NSInteger diffYear = [cps year];


//+ currentCalendar
    //取得当前用户的逻辑日历
    //currentCalendar取得的值会一直保持在cache中,第一次取得以后如果用户修改该系统日历设定,这个值也不会改变。
    NSCalendar *calendar = [NSCalendar currentCalendar];
    NSLog(@"calendar = %@",calendar);
    
    //+ (id)autoupdatingCurrentCalendar
    //取得当前用户的逻辑日历
    //用autoupdatingCurrentCalendar,那么每次取得的值都会是当前系统设置的日历的值。
    NSString *autoupdatingCurrent = [NSCalendar autoupdatingCurrentCalendar];
    NSLog(@"autoupdatingCurrent = %@",autoupdatingCurrent);
    


- (void)updateWeek{
    //如果想要用公历的时候,就要将NSDateFormatter的日历设置成公历。否则随着用户的系统设置的改变,取得的日期的格式也会不一样。
    NSCalendar *initCalendar = [[NSCalendar alloc]initWithCalendarIdentifier:NSGregorianCalendar];
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    [formatter setCalendar:initCalendar];

    [initCalendar setFirstWeekday:1];
    [initCalendar setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]];
    [initCalendar setMinimumDaysInFirstWeek:7];
    [initCalendar setTimeZone:[NSTimeZone defaultTimeZone]];
    
    //返回日历标示符
    NSString *calendarIdentifier = [initCalendar calendarIdentifier];
    NSLog(@"calendarIdentifier = %@",calendarIdentifier);
    
    //– firstWeekday
    //返回日历指定的每周的第一天从星期几开始。缺省为星期天,即firstWeekday = 1
    int firstWeekday = [initCalendar firstWeekday];
    NSLog(@"firstWeekday = %d",firstWeekday);
    
    // 返回日历指定的地区信息。
    NSLocale *locale = [initCalendar locale];
    NSLog(@"locale = %@",locale.localeIdentifier);
    
    //– maximumRangeOfUnit:    //返回单元的最大范围
    //- minimumRangeOfUnit:    //返回单元的最小范围
    //比如Day Calendar Unit就是一个月最多31天这个意思
    NSRange range = [initCalendar maximumRangeOfUnit:NSDayCalendarUnit];
    NSLog(@"range = %d",range.length);
    
    //- minimumDaysInFirstWeek
    //返回日历指定的第一周必须包含的最少天数。
    int minimumDays = [initCalendar minimumDaysInFirstWeek];
    NSLog(@"minimumDays = %d",minimumDays);
    
    //- ordinalityOfUnit:inUnit:forDate:
    //在一个给定的时间,小日历单元如(一天)在大日历单元(一周)中的序数。
    //比如forDate参数是星期一,而且firstWeekday 参数被设置为2(也就是星期一为一周的第一天),那么返回为1
    //通过这个函数可以判断 例如 :给定的日期是在一周的第几天,或一月的第几周。一年的第几个月。一年的第几天等
    //注:firstWeekday的设定会影响这个函数的返回值
    int ordinality = [initCalendar ordinalityOfUnit:NSWeekdayCalendarUnit inUnit:NSWeekCalendarUnit forDate:[NSDate date]];
    NSLog(@"ordinality = %d",ordinality);
    
    //- rangeOfUnit:inUnit:forDate:
    //一个小日历单元下。大日历单元的范围 例如 小日历单元是天。大日历单元是周。那么范围就是7天。就是1-7
    NSRange rangeOfUnit = [initCalendar rangeOfUnit:NSWeekdayCalendarUnit inUnit:NSWeekCalendarUnit forDate:[NSDate date]];
    NSLog(@"rangeOfUnit = %d",rangeOfUnit.length);
    
    //如果startDate和interval均为可计算的,那么函数返回YES否则返回NO.比如:
    NSDate *dateOut = [NSDate date];
//    NSDate **sDate = &dateOut;
    
    NSDateComponents *dc = [[NSDateComponents alloc] init];
    [dc setYear: 2013];
    [dc setMonth: 4];
    [dc setDay: 6];
    
    NSDate *date = [initCalendar dateFromComponents:dc];

    NSTimeInterval intOut;
    NSTimeInterval *intervalOut = &intOut;
    
    if ([initCalendar rangeOfUnit:NSWeekCalendarUnit startDate:&dateOut interval:intervalOut forDate:date]){
        NSLog(@"%@", [dateOut description]);
        NSLog(@"%f", *intervalOut/60/60/24);
    }
    else{
        NSLog(@"Can not be calculated!");
    }
    
    //- timeZone:
    //返回日历指定的时区信息。
    NSTimeZone *timeZone = [initCalendar timeZone];
    NSLog(@"timeZone = %@",timeZone.abbreviation);
    
    //- components:fromDate:
    //返回时间组件
    unsigned unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit |  NSDayCalendarUnit;
    NSDateComponents *comps = [initCalendar components:unitFlags fromDate:[NSDate date]];
    NSLog(@"NSDateComponents - %d",comps.year);
    
    //- dateByAddingComponents:toDate:options:
    //追加日期 并返回一个新日期
    //
    NSDate *currentDate = [NSDate date];
    NSDateComponents *comps3 = [[NSDateComponents alloc] init];
    [comps3 setMonth:2];
    [comps3 setDay:3];
    NSDate *newDate = [initCalendar dateByAddingComponents:comps3 toDate:currentDate  options:0];
    NSLog(@"newDate = %@",newDate);
}



参考文章: Cocoa Foundation框架学习笔记 - NSCalendar  Cocoa中对日期和时间的处理 NSCalendar (一)   NSCalendar 日历类

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值