iOSで年月日を操作するコツ
iOSで今月の1日や前月末日を求めたいことが頻繁にある。
iOSで年月日を操作するには次の3つを押さえる必要がある。
これについては、どのプラットフォームでもどの言語でも同様だ。
・カレント・カレンダー
通常はグレゴリオ暦を使う。
・システム・タイムゾーン
日本時間やグリニッジ標準時などそのプラットフォームで設定されているタイムゾーンを使う。
コンピュータがもつ時計(グリニッジ標準時をベースとして1970年1月1日からの秒数)を各国の時差を勘案して年月日表示するために使うものだ。
日本時間を指定した場合は、グリニッジ標準時よりちょうど9時間早い時間を表示する。
・NSDateComponents
iOSの場合には、NSDate そのものではなく別クラスの NSDateComponents を介して年月日の操作を行う。
-
1)カレント・カレンダーを指定すること
年月日を操作するには、NSCalendarクラスを指定する必要がある。
NSCalendar *calendar = [NSCalendar currentCalendar];
2)NSDateComponentsクラスを使用すること
日付を操作したりNSDateから年月日を抽出したりするには、NSDateComponents クラスを使う。
NSDate *date = [NSDate date]; NSDateComponents *dateComponents = [calendar components:NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay fromDate:date];
3)タイムゾーン(NSTimeZone)はシステム・タイムゾーン(iPhone設定のタイムゾーン)を指定すること
[dateComponents setTimeZone:[NSTimeZone systemTimeZone]];
4)1ヶ月前の NSDate を求める方法
NSDateComponents#setMonth をマイナス1することで前月を表す。
\* 年末年始にまたがる(年が変わる)場合も対応している。
NSDate *date = [NSDate date]; NSDateComponents *dateComponents = [calendar components:NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay fromDate:date]; [dateComponents setYear:dateComponents.year]; [dateComponents setMonth:dateComponents.month - 1]; [dateComponents setDay:dateComponents.day]; NSDate *aMonthAgo = [calendar dateFromComponents:dateComponents];
5)前月の1日の NSDate を求める方法
4で1ヶ月前の NSDate を求めた後に NSDateComponents#setDay に1を指定する
NSDateComponents *dateComponents = [calendar components:NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay fromDate:aMonthAgo]; [dateComponents setYear:dateComponents.year]; [dateComponents setMonth:dateComponents.month]; [dateComponents setDay:1]; NSDate *aMonthAgo = [calendar dateFromComponents:dateComponents];
6)前月の月末の NSDate を求める方法
// 当月の1日の NSDate を求める NSDate *date = [NSDate date]; NSDateComponents *dateComponents = [calendar components:NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay fromDate:date]; [dateComponents setYear:dateComponents.year]; [dateComponents setMonth:dateComponents.month]; [dateComponents setDay:1]; NSDate *firstDayOnThisMonth = [calendar dateFromComponents:dateComponents]; // 当月1日の前日=前月の末日 の NSDate を求める NSDateComponents *dateComponents = [calendar components:NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay fromDate:firstDayOnThisMonth]; [dateComponents setYear:dateComponents.year]; [dateComponents setMonth:dateComponents.month]; [dateComponents setDay:-1]; NSDate *lastDayOnLastMonth = [calendar dateFromComponents:dateComponents];