今月初から末までのデータを取得するために、月初と月末日を取得するためにこんな感じのコードを書きました。
NSDate *date = [NSDate date];
NSLog(@"date = %@",date);
NSCalendar *calendar = [NSCalendar currentCalendar];
calendar.locale = [NSLocale currentLocale];
NSDateComponents *comp = [calendar components:NSYearCalendarUnit
| NSMonthCalendarUnit
| NSDayCalendarUnit
| NSHourCalendarUnit
| NSMinuteCalendarUnit
| NSSecondCalendarUnit
fromDate:date];
comp.day = 1;
comp.hour = 0;
comp.minute = 0;
comp.second = 0;
NSDate *monthBeginningDate = [calendar dateFromComponents:comp];
NSLog(@"monthBeginningDate = %@",monthBeginningDate);
NSLog(@"monthBeginningDate = %@",[monthBeginningDate descriptionWithLocale:[NSLocale currentLocale]]);
NSRange range = [calendar rangeOfUnit:NSDayCalendarUnit inUnit:NSMonthCalendarUnit forDate:date];
int lastDay = range.length;
comp.day = lastDay;
NSDate *monthEndingDate = [calendar dateFromComponents:comp];
NSLog(@"monthEndingDate = %@",monthEndingDate);
NSLog(@"monthEndingDate = %@",[monthEndingDate descriptionWithLocale:[NSLocale currentLocale]]);
注意点としては、NSDateは単純にログ出力すると、グリニッジ標準時で日付が出力されます。
なので、例えば2014年の5月の月初と月末を取得すると、
月初=2014-04-30 15:00:00 +0000
月末=2014-05-30 15:00:00 +0000
となってしまいますが、これはバグっているからではなく、グリニッジ標準時標準時換算であるためです。
(恥ずかしながら、これでちょっと混乱してハマってしまいました)
ロケール付きで出力すると、このように期待した日付が取得できている事が確認できます。
Thursday, May 1, 2014 at 12:00:00 AM Japan Standard Time
Saturday, May 31, 2014 at 12:00:00 AM Japan Standard Time