DX・デジタルトランスフォーメーション

AppStoreにて無料公開中! ”システム手帳”で検索! - AppStoreへ iPad版 - iPhone版

ブロックチェーン・暗号技術 | android | iOS | Web | アプリの著作権 | 日本のなりたち | 禅・大乗仏教 | 新しい社会

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];