iOS で、西暦年を取得する際、大きな落とし穴がある。
これが原因で、10年程前にトラブルが起き、以来、注意していたが、最近も失敗してしまった。
iOS の Objective-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];
以前は、和暦の設定にすると、色々なアプリの動作が異常になった。