« 【Cocoa】メモリ管理勉強中(改訂版) | トップページ | WinwdowsでObjective-C パート2 (NS~クラスも利用可) »

2009年1月14日 (水)

【Cocoa】NSDateから日時の値を取得する

 NSDateオブジェクトが持っている日時情報から、年月日時分秒の各数値を取り出す方法を調べた結果をメモしておく。

 今回の記事は正直自分自身理解しきれていない。が、一応取得はできたのでこれはこれで使えることを期待したい。・・・というかこの方法って、本当にこれでいいんだろうか。もっとスマートな方法があるような気がしてならないんだが・・・。

 以下のソースは、ウインドウの上に配置されているボタンのアクションメソッドを想定している。このアクションメソッドが実行されると、同じくウインドウ上に配置されているテキストフィールド(textField)に文字列を表示する処理をしているつもり。ソースは、こちら(AppleのDeveloper Conection上のドキュメント)にあったソースを参考にした。

1:- (IBAction)btnOnClick:(id)sender {
2:     NSCalendar* cal = [[NSCalendar alloc]
3:                       initWithCalendarIdentifier:NSGregorianCalendar];
4:     unsigned int unitFlags = NSYearCalendarUnit |
5:                              NSMonthCalendarUnit |
6:                              NSDayCalendarUnit |
7:                              NSHourCalendarUnit |
8:                              NSMinuteCalendarUnit |
9:                              NSSecondCalendarUnit;
10:  NSDateComponents *components =
11:    [cal components:unitFlags fromDate:[NSDate date]];
12:  int year = [components year];
13:  int month = [components month];
14:  int day = [components day];
15:  int hour = [components hour];
16:  int minute = [components minute];
17:  int second = [components second];
18: NSString* str = [NSString stringWithFormat:@"%d/%d/%d %d:%d:%d",
19:                             year,month,day,hour,minute,second];
20:  [textField setStringValue:str];
21:  [cal release];
22:}

 まず2行目でNSCalendarクラスのオブジェクトを生成している。使用している初期化メソッドは「initWithCalendarIdentifier」だ。これは、生成されたカレンダーオブジェクトを初期化しているのだが、このときどういう暦で初期化するのかを言うことができる。ここでは「NSGregorianCalendar」を指定している。いわゆるグレゴリオ暦だ。

 ヘルプを見るとこのほかにNSBuddhistCalendar(仏教歴?)とかNSIslamicCivilCalendar(イスラム歴?)とか指定できるらしい。

 4行目のunitFlags変数は、11行目で使用する。NSCalendarクラスのcomponentsメソッドで、年月日時分秒のどの値を取り出すかを指定するために使用するらしい。

 10行目でNSDateComponentsのオブジェクトへのポインタの宣言、11行目以降でNSDateComponentsオブジェクトの生成を行っている。NSDateComponentsクラスは、単純に年月日時分秒の値を保持するためのクラスのようだ。ヘルプ上、そのほかに機能は持っていないように見えた。

 NSDateComponentsオブジェクトの生成には、NSCalendarクラスのcomponentsメソッドを使用する。4行目で作ったフラグと、取り出したい元の日付を表すNSDateオブジェクトを指定する。このソースでは、11行目に[NSDate date]と指定しているので、現在の日時を処理の対象にしている。

 12行目から17行目までは日時値の取り出し。各々int型の変数に取り出している。

 18行目、19行目では、取り出した値を使って日時文字列を作っている。

 20行目は、生成した文字列をテキストフィールドに格納。

 21行目は、NSCalendarオブジェクトをallocで生成したので、忘れずにrelease。

 とまぁこんな感じなんだが・・・本当にこんな面倒な方法しかないのか?(・_・;)

|

« 【Cocoa】メモリ管理勉強中(改訂版) | トップページ | WinwdowsでObjective-C パート2 (NS~クラスも利用可) »

Mac」カテゴリの記事

プログラミング」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/95697/27109708

この記事へのトラックバック一覧です: 【Cocoa】NSDateから日時の値を取得する:

« 【Cocoa】メモリ管理勉強中(改訂版) | トップページ | WinwdowsでObjective-C パート2 (NS~クラスも利用可) »