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];
2023年12月 | ||||||
日 | 月 | 火 | 水 | 木 | 金 | 土 |
  |   |   |   |   | 1 | 2 |
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |   |   |   |   |   |   |
iOS
web
?スA?スv?ス?ス?スフ抵ソス?ス??
?スu?ス?ス?スb?スN?ス`?スF?ス[?ス?ス?ス^?ステ搾ソス?スZ?スp
?スV?ス?ス?ス?ス?スミ会ソス
?スT?スE?ス?ス謨ァ?ス?ス
?ス?ス?ス{?スフなりた?ス?ス