質問: formatter.date(from: dateString) print("date: \(date!)") ``` この認識は例えばこの記事の下記内容などからそのように思っていました。 > > これを実行してみると通常の設定ではdateは正しく2017/8/12と取得されます。 > > しかし、例えばiPhoneの設定から日付を西暦ではなく「和暦」にしてみるとどうでしょう? > > すると4005/8/12と取得されてしまいます。 > > > つまり想定される値は 端末の言語設定(設定>一般>言語と地域)により下記のように変更されることでした。 * 西暦: 2000-08-23 15:00:00 +0000 * 和暦: 3988-08-23 15:00:00 +0000 でしたが、実際には西暦/和暦共に`2000-08-23 15:00:00 +0000`が出力されていました。 そこで`formatter`のlocale、calenderの値を出力してみたところ下記のようになっていました。 ``` locale: ja_JP (fixed) calender:gregorian (fixed) ``` 従ってlocaleを設定するとcalenderも変更される、と思っていますが、 これは正しい認識でしょうか? localeを設定し、暦が変更されているので端末の影響を受けていない、という解釈です。 また、これが正しいならそれについて記載された公式のリファレンス等ありますでしょうか? (この内容について確信が持てず、、)
回答: Qiitaの説明記事は、少し言葉足らずになっていると思います。 > > しかし、例えばiPhoneの設定から日付を西暦ではなく「和暦」にしてみるとどうでしょう? > > すると4005/8/12と取得されてしまいます。 > > > というよりも > > しかし、例えばiPhoneの設定から日付を西暦ではなく「和暦」にし、 > > `formatter.locale = Locale(identifier: "ja_JP")`の行を削除してみるとどうでしょう? > > すると4005/8/12と取得されてしまいます。 > > > と説明すべきだと思います。 (今は令和になっているので、令和2000年=西暦4018になるようです。) DateFormatterのlocaleとCalendarのlocaleは別に連動したりしません。 `formatter.locale = Locale(identifier: "ja_JP")` を設定したら、localeは `ja_JP (fixed)`になるし、 locale設定コードを削除すれば、iPhoneの設定内容がデフォルトで入るので、 localeは `japanese (current)`のようになります。 Calendarは、 `let calendar = Calendar(identifier: .gregorian)` でcalendarを生成したら、localeは `gregorian (fixed)`になるし、 `let calendar = Calendar.current` でcalendarを生成したらiPhoneの設定内容がデフォルトで入るので、 localeは`japanese (current)`のようになります。 インスタンスの生成の仕方の違いで中に設定されているlocaleが変わるだけです。 (2/2 0:15 追記) すみません。質問の意図を勘違いしていました。 DateFormatterのlocaleプロパティと別のCalendarインスタンスのlocaleプロパティは連動しているのか? と聞いているのではなく、 DateFormatterのlocaleプロパティと同じDateFormatterインスタンスのcalendarプロパティは連動しているのか? と聞いているのですね。 ``` let dateString = "2000/8/24" let formatter = DateFormatter() formatter.dateFormat = "yyyy/MM/dd" print(formatter.locale!) print(formatter.calendar!) print(formatter.calendar.locale!) print("date: \(formatter.date(from: dateString)!)") formatter.locale = Locale(identifier: "ja_JP") print(formatter.locale!) print(formatter.calendar!) print(formatter.calendar.locale!) print("date: \(formatter.date(from: dateString)!)") ``` iPhoneの設定を「和暦」にして、上記のコードを実行してみたところ、 次の結果が得られましたので、localeを設定すると、そのlocaleに 対応したCalendarインスタンスがcalendarプロパティに設定される と考えて良いと思います。 ``` en@calendar=japanese (current) japanese (current) en@calendar=japanese (current) date: 4018-08-23 15:00:00 +0000 ja_JP (fixed) gregorian (fixed) ja_JP (fixed) date: 2000-08-23 15:00:00 +0000 ```