libro
www.tuyano.com
初心者のためのObjective-Cプログラミング入門

NSDateと日時の扱い (6/6)

作成:2011-02-13 16:11
更新:2011-11-13 21:29

■NSDateComponentsで日時の長さを用意する

このカレンダーのところで登場したNSDateComponentsは、単にカレンダーから日時の要素の値を受け取るのに用いられるためだけのものではありません。NSDateComponentsは、日時の各要素の値をもとに時間の長さを示すのに用いられるものなのです。

したがって、これを利用して時間の長さを示し、それをもとにさまざまな日時の操作を行うことも可能なのです。といっても、ちょっとイメージしにくいかも知れませんが……。

NSDateComponentsで時間の長さを用意するには、まずインスタンスを作らないといけません。これは、普通にallocで作成できます。
NSDateComponents* 変数 = [NSDateComponents alloc];
もちろん、必要に応じてinitで初期化し、autoreleaseでオートリリース設定をしておきます。そして、これに日時の要素の値を設定して時間の長さを指定していきます。それぞれの日時の要素は、以下のようなメソッドを使って設定することができます。
[《NSDateComponents*》 setEra:《NSInteger》];
[《NSDateComponents*》 setYear:《NSInteger》];
[《NSDateComponents*》 setMonth:《NSInteger》];
[《NSDateComponents*》 setDay:《NSInteger》];
[《NSDateComponents*》 setHour:《NSInteger》];
[《NSDateComponents*》 setMinute:《NSInteger》];
[《NSDateComponents*》 setSecond:《NSInteger》];
[《NSDateComponents*》 setWeek:《NSInteger》];
[《NSDateComponents*》 setWeekday:《NSInteger》];
[《NSDateComponents*》 setWeekdayOrdinal:《NSInteger》];
[《NSDateComponents*》 setQuarter:《NSInteger》];
これらのメソッドを使って各要素の値を変更していくことで、時間の長さを作っていくことができるわけです。――例えば、「1ヶ月と2週間」という時間の長さを示すならば、「setMonth:1」と「setWeek:2」を呼び出して値を設定すればいいでしょう。これで、1ヶ月と2週間という時間の長さを示すNSDateComponentsが用意できます。

◯時間の加算をする
こうして作成したNSDateComponentsを使って時間の加算を行ったりすることもできます。これはNSCalendarにあるメソッドを利用するのがいいでしょう。
NSDate *変数 = [《NSCalendar*》 dateByAddingComponents:
        《NSDateComponents*》 toDate:《NSDate*》
        options:《NSUInteger》];
最後のoptions:は計算の際のオプション値で、普通はゼロを指定しておきます。これで引数のNSDateに、NSDateComponentsで指定した時間だけ加算した日時がNSDateで得られます。下のリスト欄に利用例を上げておきます。

◯2つの日時の差を計算する
また、NSCalendarを使って2つのNSDateの差を調べるのにもNSDateComponentsは活躍します。これは、NSCalendarにある以下のメソッドで行います。
NSDateComponents *変数 = [《NSCalendar*》 components:《NSCalendarUnit》
        fromDate:《NSDate*》 toDate:《NSDate*》 options:《NSUInteger》];
options:は例によって通常はゼロです。2つの日時をfromDate:toDate:に用意し、取り出す時間の単位をNSCalendarUnitで用意することで、指定した単位で時間の長さを得ることができるようになるのです。

例として、2001年の元旦から今日まで何週間と何日あるかを調べるサンプルを下のリスト欄にあげておきました。ここでは、以下のようにNSCalendarUnitを用意しています。
[NSCalendarUnit unit = NSWeekCalendarUnit|NSDayCalendarUnit;
これで、週と日の2つの単位の組み合わせで時間の長さが得られるようになる、というわけです。これを利用すれば、いちいち「秒数をもとに何日あるか計算して……」なんてこともする必要はありません。実に便利ですね!

※プログラムリストが表示されない場合

AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。

●プログラム・リスト●

※今日から1ヶ月2週間後の日付を調べる

int main (int argc, const char * argv[]) {
    @autoreleasepool {
        NSDate* date = [NSDate date];
        NSDateComponents* dc = [[NSDateComponents alloc] init];
        NSCalendar* calendar = [NSCalendar currentCalendar];
        [dc setMonth:1];
        [dc setWeek:2];
        NSDate* date2 = [calendar dateByAddingComponents:dc 
                                                  toDate:date options:0];
        NSLog(@"%@",date2);
    }
    return 0;
}


※2001年元旦から今日まで何週間と何日あるか調べる

int main (int argc, const char * argv[]) {
	@autoreleasepool {
        NSDate* date = [NSDate date];
        NSDate* date2 = [NSDate dateWithString:
                         @"2001-01-01 0:00:00 +9:00"];
        NSCalendar* calendar = [NSCalendar currentCalendar];
        NSCalendarUnit unit = NSWeekCalendarUnit | NSDayCalendarUnit;
        NSDateComponents* dc = [calendar components:unit 
                                           fromDate:date2 toDate:date options:0];
        NSLog(@"%ld週間と%ld日。",[dc week],[dc day]);
    }
    return 0;
}
※関連コンテンツ

「初心者のためのObjective-Cプログラミング入門」に戻る