NSCalendar 日历

NSCalendar   日历


 

   /**1.  System Locale Information 
     取得当前用户的逻辑日历(logical calendar) 两种类方法**/
    
    // 1.1 取得当前用户的逻辑日历
    // currentCalendar取得的值会一直保持在cache中,第一次取得以后如果用户修改该系统日历设定,这个值也不会改变。
    
    NSCalendar *currentcalender = [NSCalendar currentCalendar];
    NSLog(@"currentcalender = %@",currentcalender.calendarIdentifier);// currentcalender = gregorian

    
    
    // 1.2 取得当前用户的逻辑日历
    // 用autoupdatingCurrentCalendar,那么每次取得的值都会是当前系统设置的日历的值。
    NSCalendar *calendar2 = [NSCalendar autoupdatingCurrentCalendar];
    NSLog(@"calendar2 = %@",calendar2.calendarIdentifier);  // calendar2 = gregorian
    
    /** 2.Initializing a Calendar
     
     2.1 - (id)initWithCalendarIdentifier:(NSString *)identifier;
     初始化为各种日历。identifier的范围可以是:
     NSGregorianCalendar 阳历
     NSBuddhistCalendar 佛历
     NSChineseCalendar 中国日历
     NSHebrewCalendar 希伯来日历
     NSIslamicCalendar 伊斯兰日历
     NSIslamicCivilCalendar 伊斯兰民事日历
     NSJapaneseCalendar 日本日历
     */
    
    NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
    NSCalendar *calendar3 = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierJapanese];
    NSLog(@"calendar3 = %@",calendar3.calendarIdentifier); // calendar3 = japanese
    
    NSCalendar *calendar4 = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierChinese];
    NSLog(@"calendar4 = %@",calendar4.calendarIdentifier);  // calendar4 = chinese
    
    /*2.2 - (void)setFirstWeekday:(NSUInteger)value;
     设定每周的第一天从星期几开始,比如:
     .  如需设定从星期日开始,则value传入1
     .  如需设定从星期一开始,则value传入2
     .  以此类推
     详细信息请参阅FirstWeekday属性
     */
    [calendar setFirstWeekday:2];
    
    /*2.3 - (void)setLocale:(NSLocale *)locale;  设置区域*/
    [calendar setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]];
    
     /*2.4 - (void)setMinimumDaysInFirstWeek:(NSUInteger)mdw  */
    //设定作为(每年及每月)第一周必须包含的最少天数,比如:.  如需设定第一周最少包括7天,则value传入7
    
    [calendar setMinimumDaysInFirstWeek:7];
    
    
    /*2.5 - (void)setTimeZone:(NSTimeZone *)tz  */
    //设置时区
    [calendar setTimeZone:[NSTimeZone defaultTimeZone]];
    
    
    /**3.   Getting Information About a Calendar*/
    /*3.1 - (NSString *)calendarIdentifier 返回日历标示符 */
    NSString *canlendarIdentifier = calendar.calendarIdentifier;
    NSLog(@"canlendarIdentifier = %@",canlendarIdentifier);  //canlendarIdentifier = gregorian
    
    
    /*3.2 - (NSUInteger)firstWeekday  返回日历指定的每周的第一天从星期几开始。缺省为星期天,即firstWeekday = 1*/
    NSUInteger firstWeekday = [calendar firstWeekday];
    NSLog(@"firstWeekday = %d",firstWeekday);  // firstWeekday = 2
    
    
    /*3.3 - (NSLocale *)locale 返回日历指定的地区信息*/
    
    NSLocale *locale = [calendar locale];
    NSLog(@"localeIdentifier = %@",locale.localeIdentifier);   // localeIdentifier = en_US
    
    /*3.4 
     //- (NSRange)maximumRangeOfUnit:(NSCalendarUnit)unit    //返回单元的最大范围
     //- (NSRange)minimumRangeOfUnit:(NSCalendarUnit)unit    //返回单元的最小范围 
     //比如Day Calendar Unit就是一个月最多31天这个意思
     
     Calendar Units
     Specify calendrical units such as day and month.
     
     enum {
     NSEraCalendarUnit = kCFCalendarUnitEra,
     NSYearCalendarUnit = kCFCalendarUnitYear,
     NSMonthCalendarUnit = kCFCalendarUnitMonth,
     NSDayCalendarUnit = kCFCalendarUnitDay,
     NSHourCalendarUnit = kCFCalendarUnitHour,
     NSMinuteCalendarUnit = kCFCalendarUnitMinute,
     NSSecondCalendarUnit = kCFCalendarUnitSecond,
     NSWeekCalendarUnit = kCFCalendarUnitWeek,
     NSWeekdayCalendarUnit = kCFCalendarUnitWeekday,
     NSWeekdayOrdinalCalendarUnit = kCFCalendarUnitWeekdayOrdinal,
     NSQuarterCalendarUnit = kCFCalendarUnitQuarter,
     NSWeekOfMonthCalendarUnit = kCFCalendarUnitWeekOfMonth,
     NSWeekOfYearCalendarUnit = kCFCalendarUnitWeekOfYear,
     NSYearForWeekOfYearCalendarUnit = kCFCalendarUnitYearForWeekOfYear
     NSCalendarCalendarUnit = (1 << 20),
     NSTimeZoneCalendarUnit = (1 << 21),
     };
     typedef NSUInteger NSCalendarUnit;
     
     */
    
    // 月Day的最大范围
    NSRange maxRangeDay = [calendar maximumRangeOfUnit:NSCalendarUnitDay];
    NSLog(@"maxRangeDay = %@",NSStringFromRange(maxRangeDay));  // maxRangeDay = {1, 31}
    
    // 月Day的最小范围
    NSRange minRangeDay = [calendar minimumRangeOfUnit:NSCalendarUnitDay];
    NSLog(@"minRangeDay = %@",NSStringFromRange(minRangeDay));  // minRangeDay = {1, 28}
    
    // 每年的月的最大范围
    NSRange maxRangeMonth = [calendar maximumRangeOfUnit:NSCalendarUnitMonth];
    NSLog(@"maxRangeMonth = %@",NSStringFromRange(maxRangeMonth));  // maxRangeMonth = {1, 12}
    
    // 每个月周的最小范围
    NSRange minRangeWeekOfMonth = [calendar minimumRangeOfUnit:NSCalendarUnitWeekOfMonth];
    NSLog(@"minRangeWeekOfMonth = %@",NSStringFromRange(minRangeWeekOfMonth));    //minRangeWeekOfMonth = {1, 4}
    
    
    /* 3.5 - (NSUInteger)minimumDaysInFirstWeek 返回日历指定的第一周必须包含的最少天数。*/
    NSUInteger minimumDays = [calendar minimumDaysInFirstWeek];
    NSLog(@"minimumDays = %d",minimumDays);      // minimumDays = 7
    
    /* 3.6 - (NSUInteger)ordinalityOfUnit:(NSCalendarUnit)smaller inUnit:(NSCalendarUnit)larger forDate:(NSDate *)date*/
    //在一个给定的时间,小日历单元如(一天)在大日历单元(一周)中的序数。
    //比如forDate参数是星期一,而且firstWeekday 参数被设置为2(也就是星期一为一周的第一天),那么返回为1
    //通过这个函数可以判断 例如 :给定的日期是在一周的第几天,或一月的第几周。一年的第几个月。一年的第几天等
    //注:firstWeekday的设定会影响这个函数的返回值

    int ordinality = [calendar ordinalityOfUnit:NSCalendarUnitWeekday inUnit:NSCalendarUnitMonth forDate:[NSDate date]];
    NSLog(@"ordinality = %@",[NSString stringWithFormat:@"%d",ordinality ]);  // ordinality = 1
    
    /*3.7 - (NSRange)rangeOfUnit:(NSCalendarUnit)smaller inUnit:(NSCalendarUnit)larger forDate:(NSDate *)date */
    // 一个小日历单元下。大日历单元的范围 例如 小日历单元是天。大日历单元是周。那么范围就是7天。就是1-7
    
    NSRange rangeUnit = [calendar rangeOfUnit:NSCalendarUnitDay inUnit:NSCalendarUnitMonth forDate:[NSDate date]];
    
    NSLog(@"rangeUnit = %@",NSStringFromRange(rangeUnit));    // rangeUnit = {1, 31}
    
    /*3.8 - (BOOL)rangeOfUnit:(NSCalendarUnit)unit startDate:(NSDate **)datep interval:(NSTimeInterval *)tip forDate:(NSDate *)date  
     
     //用于返回日期date(参数)所在的那个日历单元unit(参数)的开始时间(sDate)。
     //其中参数unit指定了日历单元,参数sDate用于返回日历单元的第一天,参数unitSecs用于返回日历单元的长度(以秒为单位),参数date指定了一个特定的日期。
     //如果startDate和interval均为可计算的,那么函数返回YES否则返回NO.
     */
    
    NSDate *dateOut = [NSDate date];
    NSDateComponents *dc = [[NSDateComponents alloc] init];
    dc.year = 2014;
    dc.month = 10;
    dc.day = 1;
    
    NSDate *dateCalendar = [currentcalender dateFromComponents:dc];
    
    NSTimeInterval startTime;
    NSTimeInterval *startTimeInt = &startTime;
    
    if ([calendar rangeOfUnit:NSCalendarUnitDay startDate:&dateOut interval:startTimeInt forDate:dateCalendar]) {
        
        NSLog(@"%@",[dateOut description]);  // 2014-09-30 16:00:00 +0000
        NSLog(@"%f",*startTimeInt); // 86400.000000
    }else
    {
        NSLog(@"Can not be calculated!");
    }
    
    //3.9 - (NSTimeZone *)timeZone
    //返回日历指定的时区信息。
    NSTimeZone *timeZone = [calendar timeZone];
    NSLog(@"timeZone = %@",timeZone.abbreviation);  // timeZone = GMT+8
    
    
    /** 4 Calendrical Calculations  日历计算*/
    
    //4.1  - (NSDateComponents *)components:(NSUInteger)unitFlags fromDate:(NSDate *)date
    // NSDateComponents 返回时间组件
    
    unsigned unitFlags =  NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay|NSCalendarUnitHour|NSCalendarUnitMinute|NSCalendarUnitSecond;
    NSDate *date = [NSDate date];
    NSDateComponents *components = [calendar components:unitFlags fromDate:date];
    
    int year = components.year;
    int month = components.month;
    int day = components.day;
    int hour = components.hour;
    int minute = components.minute;
    int second = components.second;
    
    NSLog(@"%d,%d,%d,%d,%d,%d",year,month,day,hour,minute,second); // 2014,12,7,17,51,32
    
    //4.2  - (NSDateComponents *)components:(NSUInteger)unitFlags fromDate:(NSDate *)startingDate toDate:(NSDate *)resultDate options:(NSUInteger)opts
     //返回时间组件 比较2个日期的时间差值
    
    NSDate *startDate = date;
    NSDate *endDate = [[NSDate alloc] initWithTimeIntervalSinceNow:86400*2 ];
    unsigned int unitFlags2 = NSCalendarUnitYear | NSCalendarUnitMonth |NSCalendarUnitDay;
    NSDateComponents *comps2 = [calendar components:unitFlags2 fromDate:startDate  toDate:endDate  options:0];
    
    int years = [comps2 year];
    int months = [comps2 month];
    int days = [comps2 day];
    
    NSLog(@"years = %d ,months = %d days = %d",years,months,days);  // years = 0 ,months = 0 days = 2
    //输出: years = 0 ,months = 0 days = 2
    

    // 4.3 - (NSDate *)dateByAddingComponents:(NSDateComponents *)comps toDate:(NSDate *)date options:(NSUInteger)opts
    // 追加日期 并返回一个新日期
    
    NSDate *currentDate = [NSDate date];
    NSDateComponents *comps3 = [[NSDateComponents alloc] init];
    [comps3 setMonth:2];
    [comps3 setDay:3];
    NSDate *newDate = [calendar dateByAddingComponents:comps3 toDate:currentDate  options:0];
    NSLog(@"newDate = %@",newDate);  // newDate = 2015-02-10 09:51:32


    
    // 4.4    - (NSDate *)dateFromComponents:(NSDateComponents *)comps
     //创建日期
    
    NSDateComponents *comps = [[NSDateComponents alloc] init];
    [comps setYear:2014];
    [comps setMonth:10];
    [comps setDay:1];
    [comps setHour:12];
    [comps setMinute:0];
    [comps setSecond:0];
    NSDate *createdate = [calendar dateFromComponents:comps];
   
    NSLog(@"createdate = %@",createdate);  // createdate = 2014-10-01 04:00:00 +0000


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值