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

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

作成:2011-02-13 12:19
更新:2011-11-13 21:24

■ロケールで日時をフォーマットする

さて、もう1つの「ロケール情報を使ってフォーマットする」というやり方も説明しましょう。ロケール情報というのは、国や地域、使用言語に関する種類を示すもので、Foundationフレームワークには「NSLocale」というクラスとして用意されています。

なぜ、このロケール情報と日時のフォーマットが関係あるのかというと、要するに「その国の一般的な日時の表示形式にフォーマットする」ためのものなのです。それぞれの国では、日時の表記の仕方はだいたい決まっています。日本では「2011年1月1日」というようになります。間違っても「1月2011年1日」なんて書くことはありません。

こうした表示の形式は、標準的な形式に揃えたほうが使う側も理解しやすいため、それぞれのロケールごとに標準形式を最初から用意してあるのです。――では、ロケールを設定するメソッドを整理しておきましょう。
NSDateFormatter *変数 = [《NSDateFormatter*》 setLocale:《NSLocale*》];
これで、NSFormatterにロケール情報が設定されます。後は、stringFromDate:メソッドでNSDateをフォーマットすれば、指定した形式でテキストが得られる……となれば簡単なんですが、実はこの前にやるべきことがあります。


■ロケール情報を設定する

まず、NSLocaleインスタンスを用意しなければいけません。これはallocでインスタンスを作成し、国を示すテキストを指定して初期化処理をします。
NSLocale* 変数 [[NSLocale alloc] initWithLocaleIdentifier:《NSString*》];
initWithLocaleIdentifier:では、国や地域を示すテキストを用意します。日本の場合、@"ja"または@"ja_JP"と指定をします。米国なら@"en_US"とすればいいでしょう。こうして作成されたNSLocalesetLocale:で設定すればいいわけです。

が、これでおしまいではありません。次に「どういうスタイルで日時を表示するか」を指定する必要があります。そのロケールの標準的なフォーマット形式といっても、それにはいくつかの種類があるのです。例えば日本であっても、「2011年1月1日」と書くこともあれば、「11/1/1」というように短く書くこともあります。そうした基本的な形式を指定するのです。これは以下のメソッドで行います。
[《NSDateFormatter*》 setDateStyle:スタイルの種類 ];
[《NSDateFormatter*》 setTimeStyle:スタイルの種類 ];
設定は、日付と時刻のそれぞれについて行います。スタイルの種類は、Foundationフレームワークに用意されている以下の値のいずれかを指定します。
非表示 :NSDateFormatterNoStyle
短い形式:NSDateFormatterShortStyle
標準形式:NSDateFormatterMediumStyle
長い形式:NSDateFormatterLongStyle
これらで日時の表示形式を指定し、ようやくstringFromDate:でフォーマットしたテキストを得られるようになります。ざっと利用例を掲載しておきましょう。
        NSDate* date = [NSDate date];
        NSDateFormatter* fmt = [[NSDateFormatter alloc] init];
        NSLocale *locale = [[NSLocale alloc]
                            initWithLocaleIdentifier:@"ja"];
        [fmt setDateStyle:NSDateFormatterLongStyle];
        [fmt setTimeStyle:NSDateFormatterMediumStyle];
        [fmt setLocale:locale];
        NSLog(@"%@",[fmt stringFromDate:date]);
ここでは、@"ja_JP"に指定したNSLocaleを作成し、日付を長い形式、時刻を標準形式でそれぞれ設定してフォーマットをしています。自由なフォーマット形式で出力したければ、先のinitWithDateFormat:でフォーマット形式を指定したほうが簡単ですが、システムに用意されている標準的な形式のほうが、システムの表示形式変更などにも自動的に対応できます。

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

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

●プログラム・リスト●

※ロケールを使ったフォーマットの例

#import <Foundation/Foundation.h>

int main (int argc, const char * argv[]) {
	@autoreleasepool {
		NSDate* date = [NSDate date];
        NSDateFormatter* fmt = [[NSDateFormatter alloc] init];
        NSLocale *locale = [[NSLocale alloc]
                            initWithLocaleIdentifier:@"ja"];
        [fmt setDateStyle:NSDateFormatterLongStyle];
        [fmt setTimeStyle:NSDateFormatterMediumStyle];
        [fmt setLocale:locale];
        NSLog(@"%@",[fmt stringFromDate:date]);
	}
    return 0;
}
※関連コンテンツ

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