macOS/iOS API解説

iOS , Mac アプリケーション開発のために使われる主要フレームワークの日本語情報です。2010年代に書かれた内容です。今後更新はありません。

目次

NSCalendarクラス

INDEX>Foundation> >

apple(mac)

apple(iOS)

解説

継承 NSObject
準拠 NSCoding
NSCopying
NSObject (NSObject)
フレームワーク /System/Library/Frameworks/Foundation.framework
使用可能 Mac OS X v10.4以降
iOS 2.0以降
定義 NSCalendar.h

概要

本クラスについて

カレンダーも古くから人の生活に密接にかかわり、年、週、曜日、日など文化・地域で様々な表現があります。カレンダーオブジェクトはNSDateで表される一般的な日付とカレンダーとの間の計算を行い、異なるカレンダー同士の変換やユーザーへの表示を行います。

現在日本で一般的に使われている暦はグレゴリオ暦ですが、グレゴリオ暦にかえた時期は国によって異なります。
1582年スペイン、ポルトガル、イタリア
1752年イギリス
1872年日本
1940年ソ連

作成

システムロケール情報

現在のロケールでのカレンダーを作成するには(+ currentCalendarメソッドがありますが、日本語環境で使用するとNSJapaneseCalendarで作成されます。時間の管理に使う場合はNSGregorianCalendarで作成して、currentCalendarは表示の際に使用するようにしましょう。

ユーザーがシステム環境設定で言語環境を変更した際に反映されるカレンダーを作成するには(+ autoupdatingCurrentCalendar)メソッドを使います。

カレンダーの初期化

allocで作成して、カレンダーオブジェクトを初期化するには(– initWithCalendarIdentifierメソッドを使用します。
カレンダーオブジェクトがどの種類のカレンダーかを取得するには(– calendarIdentifierメソッドを使用します。

グレゴリオ歴でカレンダーを作成するサンプル

#pragma mark NSCalendar  initWithCalendarIdentifier:
-(void)method001
{
    NSCalendar *aCalendar = [[NSCalendar alloc]
                            initWithCalendarIdentifier:NSGregorianCalendar];
    NSLog(@"%@",[aCalendar description]);
}

iOSで使うことができる暦のID
●NSGregorianCalendar
グレゴリオ歴 一般的に使われている西暦

●NSBuddhistCalendar
タイ仏暦
仏滅紀元 - Wikipedia


●NSChineseCalendar
中国暦 太陰太陽暦

●NSHebrewCalendar
ユダヤ

●NSIslamicCalendar
イスラム暦

●NSIslamicCivilCalendar
インド太陽暦

●NSJapaneseCalendar
和暦

●NSRepublicOfChinaCalendar
台湾歴

●NSPersianCalendar
ペルシャ

●NSIndianCalendar
インド国定歴

●NSISO8601Calendar
ISO 8601 表記のカレンダー
2012-08-04T03:21:40+00:00

週の始まりの日を何曜日にするかをセットするのは(– setFirstWeekday:)メソッドを使用します。日曜日が1、月曜日が2…となっています。デフォルトでは1つまり日曜日が週の始まりとなっています。この情報を得るメソッドは(– firstWeekday)です。

カレンダーオブジェクトのロケール(NSLocale)をセットするには(– setLocaleメソッドを使います。ロケールを得るには(– localeメソッドを使います。

カレンダーオブジェクトのタイムゾーン(NSTimeZone)をセットするには(– setTimeZoneメソッドを使います。タイムゾーンを得るには(– timeZoneメソッドを使います。

指定したユニットの最大の場合の値の範囲を取得するには(– maximumRangeOfUnitメソッドを使用します。指定したユニットの最小の場合の値の範囲を取得するには(– minimumRangeOfUnitメソッドを使用します。
例えば日のユニット(NSDayCalendarUnit)であれば最小は28日なので1から28、最大は31日なので1から31となります。

時間経過を知るには(– ordinalityOfUnit:inUnit:forDateメソッドを使います。指定したユニットの中で(一年の中でとか一日の中でとか)どれくらいの時間が(何日とか何分とか)経っているかを知ることができます。

#pragma mark NSCalendar  ordinalityOfUnit:
-(void)method010
{
    NSCalendar *aCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    
    NSDateFormatter * formatter = [[NSDateFormatter alloc] init];
    [formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss Z"];
    
    NSDate * aDate = [formatter dateFromString:@"2012-08-15 01:23:45 +0900"];
    NSDate * bDate = [formatter dateFromString:@"2012-08-15 01:23:26 +0900"];
    
    NSUInteger aOrdinal =
    [aCalendar ordinalityOfUnit:NSSecondCalendarUnit
                                            inUnit:NSMonthCalendarUnit
                                           forDate:aDate];
    
    NSUInteger bOrdinal =
    [aCalendar ordinalityOfUnit:NSSecondCalendarUnit
                                            inUnit:NSMonthCalendarUnit
                                           forDate:bDate];
    
    NSLog(@"%s %d",__FUNCTION__, (aOrdinal - bOrdinal));
}

レシーバのカレンダーで指定した日時の指定したユニットの範囲を得るには(– rangeOfUnit:inUnit:forDateメソッドを使います。2012年8月15日の日ユニット(NSDayCalendarUnit)であれば1から31になります。

レシーバのカレンダーの年初の曜日をセットするには(– setMinimumDaysInFirstWeekメソッドを使います。この情報を取得するには(– minimumDaysInFirstWeek)メソッドを使います。ISO 8601が木曜日始まりになっています。木曜日始まりの経緯についてはISO 8601のドキュメントをご覧下さい。

レシーバのカレンダーで指定したユニットの最初を得るには(– rangeOfUnit:startDate:interval:forDate:)メソッドを使用します。2012-08-15 01:23:45 +0000の「時ユニット」(NSHourCalendarUnit)の最初と指定すると2012-08-15 01:00:00 +0000がforDate:のNSDateに入れられます。

#pragma mark NSCalendar  rangeOfUnit:
-(void)method012
{
    NSCalendar *aCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    
    NSDateFormatter * formatter = [[NSDateFormatter alloc] init];
    [formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss Z"];
    
    NSDate * aDate = [formatter dateFromString:@"2012-08-15 01:23:45 +0000"];
    

    NSDate *bDate ;
    NSTimeInterval bInt ;
    BOOL result = 
    [aCalendar rangeOfUnit:NSHourCalendarUnit
                 startDate:&bDate
                  interval:&bInt
                   forDate:aDate];
    if (result) {
        NSLog(@"%s %@ %f",__FUNCTION__, [bDate description],bInt);
    }else{
        NSLog(@"%s %@",__FUNCTION__,@"false");
    }
    //=>2012-08-15 01:00:00 +0000 3600.000000
}

カレンダーの計算

日付コンポーネントオブジェクトをレシーバのカレンダーを使ってNSDateに変換するには(– dateFromComponentsメソッドを使います。

指定したユニットと日付でNSDateComponentsオブジェクトを作成するには(– components:fromDateメソッドを使います。
二つのNSDateの差分を指定したユニットで返すには(– components:fromDate:toDate:options:)メソッドを使います。
指定した日付(NSDate)に指定したNSDateComponentsを追加して新しいNSDateオブジェクトを作成するには(– dateByAddingComponents:toDate:optionsメソッドを使います。

2012-08-15 03:23:45 +0000に1分追加するサンプル

#pragma mark NSCalendar  dateByAddingComponents:toDate:options:
-(void)method016
{
    NSCalendar *aCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    NSDateFormatter * formatter = [[NSDateFormatter alloc] init];
    [formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss Z"];
    
    NSDate * aDate = [formatter dateFromString:@"2012-08-15 01:00:45 +0000"];
    NSDate * bDate = [formatter dateFromString:@"2012-08-15 03:23:45 +0000"];
    
    NSDateComponents *aComps =
    [aCalendar components:NSMinuteCalendarUnit fromDate:aDate];
    NSDate *cDate =
    [aCalendar dateByAddingComponents:aComps
                               toDate:bDate
                              options:0];
    
    NSLog(@"%s %@",__FUNCTION__ ,[cDate description]);
    //=>2012-08-15 03:23:45 +0000
    
}

適合するプロトコル

メソッド

システムロケール情報
+ currentCalendar 2.0
+ autoupdatingCurrentCalendar 2.0
カレンダーの初期化
– initWithCalendarIdentifier 2.0
– setFirstWeekday: 10.4 2.0
– setLocale 10.4 2.0
– setMinimumDaysInFirstWeek 2.0
– setTimeZone 2.0
カレンダーについての情報を得る
– calendarIdentifier 2.0
– firstWeekday 2.0
– locale 2.0
– maximumRangeOfUnit 2.0
– minimumDaysInFirstWeek 2.0
– minimumRangeOfUnit 2.0
– ordinalityOfUnit:inUnit:forDate 2.0
– rangeOfUnit:inUnit:forDate 2.0
– rangeOfUnit:startDate:interval:forDate: 2.0
– timeZone 2.0
日付の計算
– components:fromDate 2.0
– components:fromDate:toDate:options 2.0
– dateByAddingComponents:toDate:options 2.0
– dateFromComponents 2.0

サブクラス化の注意

引数

参照

関連記事

NSCalendar on iOS Advent Calendar 2013


iOS - NSLocaleIdentifier とカレンダーの暦設定 - Qiita

Locale - ICU User Guide