Skip to content

Instantly share code, notes, and snippets.

@jkatayama
Created March 2, 2016 09:20
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jkatayama/11ddebffba290893ec88 to your computer and use it in GitHub Desktop.
Save jkatayama/11ddebffba290893ec88 to your computer and use it in GitHub Desktop.
calendar model

##calendar.h

#import <Foundation/Foundation.h>


@interface myCalender : NSObject{
    NSCalendar  *gcal;
    NSInteger   year;
    NSInteger   month;
}

-(id)init;
-(NSInteger)weekDayOfFirstDay;
-(NSInteger)dayOfMonth:(NSInteger)m inYear:(NSInteger)y;
-(NSString*)calenderString;

@end

##calendar.m

#import "myCalender.h"

@implementation myCalender

/**
 * initialize
 *
 */
-(id)init{
    self = [super init];
    if (self) {
        gcal = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
        NSDate *today = [NSDate date];
        NSUInteger unitFlags = NSYearCalendarUnit|NSMonthCalendarUnit;
        NSDateComponents *comps = [gcal components:unitFlags fromDate:today];
        year = [comps year];
        month = [comps month];
    }
    NSLog(@"year: %ld", (long)year);
    NSLog(@"month: %ld", (long)month);
    return self;
}

/**
 *
 * weekDayOfFirstDay
 * 
 * 月の最初の曜日を日曜日を1とし整数で返す
 * Return the first day of the month, Sunday as 1
 */


-(NSInteger)weekDayOfFirstDay{
    NSDateComponents *comps = [[NSDateComponents alloc] init];
    [comps setDay:1];
    [comps setMonth:month];
    [comps setYear:year];
    // First day of the month
    NSDate *theDay = [gcal dateFromComponents:comps];
    NSDateComponents *weekdayComps = [gcal components:NSWeekCalendarUnit fromDate:theDay];
    NSLog(@"month: %ld", [weekdayComps weekday]);
    return [weekdayComps weekday];

}
/**
 *
 * dayOfMonth
 *
 * 指定した月の日数を求める
 */
-(NSInteger)dayOfMonth:(NSInteger)m inYear:(NSInteger)y{
    NSDateComponents *dayComp = [[NSDateComponents alloc]init];
    [dayComp setYear:year];
    [dayComp setMonth:month];
    [dayComp setDay:1];
    NSDate *theDay = [gcal dateFromComponents:dayComp];
    //うるう年かどうかを調べる
    NSRange rangeDays = [gcal rangeOfUnit:NSDayCalendarUnit inUnit:NSMonthCalendarUnit forDate:theDay];
    return rangeDays.length;
}

/**
 * calenderString
 *
 * 指定した月のカレンダーを文字列で返す
 *
 */
- (NSString *)calenderString{
    int column = 1;
    NSMutableString *calString;
    calString = [NSMutableString stringWithCapacity:100];
    [calString appendString:@"Su Mo Tu We Th Fr Sa\n"];
    
    //最初の曜日までスキップ
    for (int i = 1; i < [self weekDayOfFirstDay]; i++) {
        [calString appendString:@"   "];
        column++;
    }

    NSString *day;
    for(NSInteger i = 1; i<=[self dayOfMonth:month inYear:year]; i++){
        if(i < 10){
                //日付が一桁の場合はスペース2つ
            day = [NSString stringWithFormat:@"  %ld", (long)i];
        }else{
            //日付が二桁の場合はスペース一つ
            day = [NSString stringWithFormat:@" %ld", (long)i];
        }
        [calString appendString:day];
        //1週間文表示したら改行を入れる
        if(column == 7){
            [calString  appendString:@"\n"];
            column = 0;
        }
        column++;
    }
    return calString;
}


@end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment