MILLEN BOX 2

個人iOSアプリ開発者hollymotoによる勉強の記録。時々雑記。

DateFormatterを使ったんだけど曜日が漢字で出ないの巻

こんにちは。hollymoto@anthrgrnwrld です。
ちょっとDateクラスをいじってます。
実はあんまり得意ではなく、Dateのオブジェクトをそのまんまprintにぶっ込んで確認しちゃうようなこともしたりしなかったり。
それじゃダメだよねーってことでDateFormatterを触ってみました。
以前触った時は理解ってよりもとにかくやりたいことをやるために決め打ちで書いてる感じで使えたとは言えませんでしたが、今回はこのページを参考にしながら結構いい手応えで理解を進めてました。 が、、、
Locale構造体を "ja_JP" で指定して動かしてもいても曜日の表示が漢字表記にならない!って現象にぶつかって詰まりました。
今回はその解決策について書いていきます。

目次

1. DateFormatterをこう使った(期待動作しない編)

let dateFormatter = DateFormatter()
let currentLocale = Locale(identifier: "ja_JP")
dateFormatter.dateFormat = DateFormatter.dateFormat(fromTemplate: "MM/dd(EEE)", options: 0, locale: currentLocale)
let strDate = dateFormatter.string(from: Date())  // 期待値"07/15(水)"
print(strDate)

DateFormatter.dateFormatの引数localeのとこでLocale指定が出来ると考えていました。
しかしこのコードだと"07/15(Wed)"になってしまいます。

2. DateFormatterをこう使った(あれ?これだと期待動作するぞ編)

let dateFormatter = DateFormatter()
let currentLocale = Locale(identifier: "ja_JP")
dateFormatter.locale = currentLocale
dateFormatter.dateFormat = "MM/dd(EEE)"
let strDate = dateFormatter.string(from: Date())  // 期待値"07/15(水)"
print(strDate)

1の方法だと曜日が漢字になりませんでしたが、上記のコードだと漢字が表示されました。

3. 謎解き

1と2から、私はdateFormat(fromTemplate:options:locale:)の使い方がおかしいのかな?と思いました。しかし問題は解決できませんでした。

色々な方々に質問させて頂いた結果、納得行く答えを得ることができました。
それはdateFormat(fromTemplate:options:locale:)のlocale引数の指定ではDateFormatterインスタンスのLocale情報を変更しているのではなく、書式のフォーマットを変更しているだけ、というものでした。``dateFormat(fromTemplate:options:locale:)```の使い方がおかしいと感じた直感、それは当たらずとも遠からずでした。
DateFormatterインスタンスのdateFormatの指定の時に、Localeについても設定してあげれば期待通り動作できました。

let dateFormatter = DateFormatter()
let currentLocale = Locale(identifier: "ja_JP")
dateFormatter.locale = currentLocale
dateFormatter.dateFormat = DateFormatter.dateFormat(fromTemplate: "MM/dd(EEE)", options: 0, locale: currentLocale)
let strDate = dateFormatter.string(from: Date())  // 期待値"07/15(水)"
print(strDate)

所感

ほんとしょうもないとこで詰まる。けどこれが今の自分の実力、仕方ない。今一度知識を積み上げるしか方法はないのだ。