##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