西海岸より

つらつらざつざつと

NSDateFormatterで日付文字列変換する際の注意

以下のように、NSDateFormatterを用いてNSDateから現在の年月を取得する場合があるけれど、
ユーザ設定が和暦の場合には、yyyyの部分が平成xx年として想定している年と異なる文字列が入り
こんでしまう場合がある。

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"yyyyMMdd"];
NSString *str = [formatter stringFromDate:[NSDate date]];
NSLog(str);

上記の実行結果は、ユーザの日付設定によって以下の通りに。

# 西暦設定の場合
20110111

# 和暦設定の場合
230111

原因はNSDateFormatterは、変換時にNSCalendarを使っているが、デフォルトでは
ユーザ設定を参照する[NSCalendar currentCalendar]が設定されてしまっているため。

対策

NSDateFormatterに西暦(グレゴリ暦)を設定することで回避可能。

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

(個人的には)yyyyを使うのは西暦を想定しているため、NSDateFormatterのカテゴリに以下のようなメソッドを定義してます。

- (id)initWithGregorianCalendar {
  if (self = [self init]) {
          NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
          [self setCalendar:calendar];
          [calendar release];
     }
     return self;
}