Cocoa Foundation框架學習筆記 - NSCalendar

+ (void)beginTest
{
    /*
     FOUNDATION_EXPORT NSString * const NSGregorianCalendar;        //公曆(經常使用)
     FOUNDATION_EXPORT NSString * const NSBuddhistCalendar;         //佛教日曆
     FOUNDATION_EXPORT NSString * const NSChineseCalendar;          //中國農曆(經常使用)
     FOUNDATION_EXPORT NSString * const NSHebrewCalendar;           //希伯來日曆
     FOUNDATION_EXPORT NSString * const NSIslamicCalendar;          //伊斯蘭曆
     FOUNDATION_EXPORT NSString * const NSIslamicCivilCalendar;     //伊斯蘭教日曆
     FOUNDATION_EXPORT NSString * const NSJapaneseCalendar;         //日本日曆(和歷,經常使用)
     FOUNDATION_EXPORT NSString * const NSRepublicOfChinaCalendar;  //中華民國日曆(臺灣)
     FOUNDATION_EXPORT NSString * const NSPersianCalendar;          //波斯歷
     FOUNDATION_EXPORT NSString * const NSIndianCalendar;           //印度日曆
     FOUNDATION_EXPORT NSString * const NSISO8601Calendar;          //ISO8601(可是如今還不可用)
     */
    
    
    //-- System Locale Information
    
    //+ currentCalendar
    //取得當前用戶的邏輯日曆
    //currentCalendar取得的值會一直保持在cache中,第一次取得之後若是用戶修改該系統日曆設定,這個值也不會改變。
    NSCalendar *calendar = [NSCalendar currentCalendar];
    NSLog(@"calendar = %@",calendar);
    
    //+ (id)autoupdatingCurrentCalendar
    //取得當前用戶的邏輯日曆
    //用autoupdatingCurrentCalendar,那麼每次取得的值都會是當前系統設置的日曆的值。
    NSString *autoupdatingCurrent = [NSCalendar autoupdatingCurrentCalendar];
    NSLog(@"autoupdatingCurrent = %@",autoupdatingCurrent);
    
    //--
    
    //-- Initializing a Calendar
    
    //- initWithCalendarIdentifier:
    //若是想要用公曆的時候,就要將NSDateFormatter的日曆設置成公曆。不然隨着用戶的系統設置的改變,取得的日期的格式也會不同。
    NSCalendar *initCalendar = [[[NSCalendar alloc]initWithCalendarIdentifier:NSGregorianCalendar] autorelease];
    NSDateFormatter *formatter = [[[NSDateFormatter alloc] init] autorelease];
    [formatter setCalendar:initCalendar];
    
    //- setFirstWeekday:
    //設置第一個工做日
    //設定每週的第一天從星期幾開始,好比:
    //.  如需設定從星期日開始,則value傳入1
    //.  如需設定從星期一開始,則value傳入2
    //.  以此類推
    [initCalendar setFirstWeekday:1];
    
    //– setLocale:
    //設置設置區域
    [initCalendar setLocale:[[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"] autorelease]];
    
    //設定做爲(每一年及每個月)第一週必須包含的最少天數,好比:.  如需設定第一週最少包括7天,則value傳入7
    //– setMinimumDaysInFirstWeek:
    [initCalendar setMinimumDaysInFirstWeek:7];
    
    //– setTimeZone:
    //設置時區
    [initCalendar setTimeZone:[NSTimeZone defaultTimeZone]];
    
    //--
    
    //-- Getting Information About a Calendar
    
    //– calendarIdentifier
    //返回日曆標示符
    NSString *calendarIdentifier = [initCalendar calendarIdentifier];
    NSLog(@"calendarIdentifier = %@",calendarIdentifier);
    
    //– firstWeekday
    //返回日曆指定的每週的第一天從星期幾開始。缺省爲星期天,即firstWeekday = 1
    int firstWeekday = [initCalendar firstWeekday];
    NSLog(@"firstWeekday = %d",firstWeekday);
    
    //– locale
    // 返回日曆指定的地區信息。
    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);
    
    //– rangeOfUnit:startDate:interval:forDate:
    //用於返回日期date(參數)所在的那個日曆單元unit(參數)的開始時間(sDate)。
    //其中參數unit指定了日曆單元,參數sDate用於返回日曆單元的第一天,參數unitSecs用於返回日曆單元的長度(以秒爲單位),參數date指定了一個特定的日期。
    //若是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 = [calendar dateFromComponents:dc];
    [dc release];
    NSTimeInterval intOut;
    NSTimeInterval *intervalOut = &intOut;
    
    if ([initCalendar rangeOfUnit:NSWeekCalendarUnit startDate:sDate interval:intervalOut forDate:date]){
        NSLog(@"%@", [*sDate description]);
        NSLog(@"%f", *intervalOut/60/60/24);
    }
    else{
        NSLog(@"Can not be calculated!");
    }
    
    //- timeZone:
    //返回日曆指定的時區信息。
    NSTimeZone *timeZone = [initCalendar timeZone];
    NSLog(@"timeZone = %@",timeZone.abbreviation);
    
    //--
    
    //-- Calendrical Calculations
    
    //- components:fromDate:
    //返回時間組件
    unsigned unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit |  NSDayCalendarUnit;
    NSDateComponents *comps = [initCalendar components:unitFlags fromDate:[NSDate date]];
    NSLog(@"NSDateComponents - %d",comps.year);
    
    //- components:fromDate:toDate:options:
    //返回時間組件 比較2個日期
    NSDate *startDate = date;
    NSDate *endDate = [NSDate date];
    unsigned int unitFlags2 = NSMonthCalendarUnit | NSDayCalendarUnit;
    NSDateComponents *comps2 = [initCalendar components:unitFlags2 fromDate:startDate  toDate:endDate  options:0];
    int months = [comps2 month];
    int days = [comps2 day];
    NSLog(@"months = %d days = %d",months,days);
    
    //- 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];
    [comps3 release];
    NSLog(@"newDate = %@",newDate);
    
    //- dateFromComponents:
    //建立日期
    {
        NSCalendar *calendar = [NSCalendar currentCalendar];
        NSDateComponents *comps = [[NSDateComponents alloc] init];
        [comps setYear:1965];
        [comps setMonth:1];
        [comps setDay:1];
        [comps setHour:2];
        [comps setMinute:10];
        [comps setSecond:0];
        NSDate *date = [calendar dateFromComponents:comps];
        [comps release];
        NSLog(@"date = %@",date);
    }
}
相關文章
相關標籤/搜索