将棋プログラミング

(将棋に関する)ソフトウェア開発のノウハウ等。

iOS 和暦の落とし穴

iOS で、西暦年を取得する際、大きな落とし穴がある。
これが原因で、10年程前にトラブルが起き、以来、注意していたが、最近も失敗してしまった。

iOSObjective-C で、西暦年を4桁の数字で取得する際、次のようなコードとなる。

    NSDateFormatter *formatter = [[[NSDateFormatter alloc] init] autorelease];
    formatter.formatterBehavior = NSDateFormatterBehavior10_4;
    formatter.dateFormat = @"yyyyMMdd";

    NSDate *today = [NSDate date];
    NSString* dateStr = [formatter stringFromDate: today];
    NSLog(@"### dateStr='%@'\n", dateStr);

本日の場合、通常は、次のように、期待通りに取得できる。

### dateStr='20200507'

ところが、このコードには大きな問題がある。
iOS では、設定で暦法を和暦にできる。
その場合、本日は令和2年なので、次のように取得される。

### dateStr='00020507'

9割以上の殆どの人は、暦法を西暦としている。そのため、一部の人だけ、トラブルが起きる、ということになる。
この問題を知らないと、解決に時間がかかるだろう。

次のコードを追加することで、設定が和暦でも西暦年が取得できる。

    NSCalendar *calendar = [[NSCalendar alloc]
                            initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
    [formatter setCalendar:calendar];
...
    [calendar release];

以前は、和暦の設定にすると、色々なアプリの動作が異常になった。