最近、時間を扱っているアプリをいくつか見直しました。
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