iPhoneのカレンダー設定を和暦にしていると、日付と曜日がずれる問題が起こる

この辺で詳しく説明されているのだけれども、全然知らなかった。そして踏んだ。
日本語環境では、NSDateFormatterでフォーマットした日付がおかしい - 24/7 twenty-four seven
NSDateFormatter - 文字列と日付の変換 - 強火で進め
一般->言語設定->カレンダーで西暦以外(和暦orタイ仏歴)を選択していると、NSDateFormatterでフォーマットする年が平成yyyy年とかになるらしい。
つまり、和暦に設定した状態でこんな感じのプログラムに_dateとして「2011/6/13」を与えた場合、

  NSString* _dateOfFirstStr = _date;
  NSDateFormatter* dateFormatter = [[[NSDateFormatter alloc] init] autorelease];
  [dateFormatter setDateFormat:@"yyyy/MM/dd"];
  NSDate* _dateFirst = [dateFormatter dateFromString:_dateOfFirstStr];
  NSCalendar *calendar = [NSCalendar currentCalendar];
  NSDateComponents *c = [calendar components:NSWeekdayCalendarUnitfromDate:_dateFirst];
  NSInteger weekday = [c weekday];

weekdayは1で日曜日。
なぜかというと、yyyy年が平成の扱いだから、ここでは平成2011年と指定されているので、平成2011年(!)=西暦3999年(!!!)。3999年のカレンダーを見てみると

> cal 6 3999
      6月 3999
日 月 火 水 木 金 土 
       1  2  3  4  5
 6  7  8  9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30

で、13日は日曜日。デバッグしていて数字を見ていても2011のままだから、これは気がつかない…。
この問題は、id:nakamura001 氏のソースを参考にして、NSDateFormatterのLocaleをen_USにすると回避できる。

  NSString* _dateOfFirstStr = _date;
  NSDateFormatter* dateFormatter = [[[NSDateFormatter alloc] init] autorelease];
  [dateFormatter setDateFormat:@"yyyy/MM/dd"];
  [dateFormatter setLocale:[[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"] autorelease]];
  NSDate* _dateFirst = [dateFormatter dateFromString:_dateOfFirstStr];

こんな感じ。これは知らないと直せない…ちょっと辛かった。
調べてみると英語圏のアプリでは対応されていないことが多いっぽい。日本語のアプリでもカレンダーの設定を西暦にしてね、という書いてるアプリもある。
これは…誰か得なんだろうか…。