[Xcode]日付の扱い

最近、時間を扱っているアプリをいくつか見直しました。

iPhoneの設定で、日付が関係する設定が大きく2つあります。

【年表示の設定】

【時刻表示の設定】

標準だと、年は西暦で、時刻は24時間表示となってます。

この2つの設定を変えた時、
和暦表示、24時間表示をオフ(12時間表示)の時は、処理中に取得される値が変わってきます。

アプリ内処理を見直して、この設定に対応できていない部分を最近修正しました。

以下は開発まわりの概要です。

アプリがこの値の変化に対応していないと、クラッシュしたり、表示できなかったりする場合があるんです。

時刻設定の、表示がぐるぐるするピッカーに時刻を設定する時、その設定する値が何もない(nil)場合は、アプリが落ちます。

日時は、yyyy/MM/dd HH:mm:ssなどのフォーマットで、文字から時刻データに変換したりしますが、
12時間表示な時、HH:mmに、22:00などの値を渡すと、変換できずにnilが返ってきます。

以下、12時間表示の時、ndateはnilが返ってくる。

        NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease];
        [dateFormatter setCalendar:[NSCalendar currentCalendar]];
        [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
        NSDate* ndate = [dateFormatter dateFromString:@"2012-01-02 22:00:00"];

このnilのndateを、ピッカーに設定

        [timePicker setDate:ndate animated:NO];

してしまうと、アプリがクラッシュします。

単純にこれを防ぐには、

        if(ndate){
            [timePicker setDate:ndate animated:NO];
        }

値を判断すればいいのだけど、これだと値を設定できない。

文字データを、日付データに変換する際は、

  • 年を西暦として扱う
  • 時刻をUS時刻として扱う

この2つを、現在の動作仕様では設定する必要があります。

カレンダーをグレゴリオ暦、LocaleをUSに。

        NSCalendar *gregorian = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease];
        NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
        [dateFormatter setCalendar:gregorian];
        [dateFormatter setLocale:[[[NSLocale alloc] initWithLocaleIdentifier:@"US"] autorelease]];
        [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
        NSDate* ndate = [dateFormatter dateFromString:@"2012-01-02 22:00:00"];

ただこれは、データ的に扱う場合で、表示する場合はまた違ってきます。

和暦設定時は、和暦表示したいし、
12時間設定時は、12時間表示したい。

こんな場合は、“時刻データを文字にする”場合なので、上記2つの設定(西暦、US時刻)は、どう表示させたいか次第。

和暦表示の場合は、以下の記事もあります。
Cocoamix.jp » [Xcode]和暦表示への対応

時刻を処理内で利用する場合と、表示する場合は、時刻の変換方法をちゃんと考えないといけない。ということですね。

以下のサイトが参考になります。

NSDateFormatter – 文字列と日付の変換 – 強火で進め

日本語環境では、NSDateFormatterでフォーマットした日付がおかしい – 24/7 twenty-four seven

スポンサーリンク

シェアする

  • このエントリーをはてなブックマークに追加

フォローする