見出し画像

DateFormatterで日付の表示にハマらない #iOS #Swift

 普段実装を進めてる中でこだわり始めたらどこまでもこだわれる部分って色々あると思います。特にグローバル対応をしていたら各国毎に違う表記をするなどありますよね。ものによってはデザイナーのこだわりが強くて細かい対応が必要になることもあると思いますが、なるべく実装を頑張らずに済ませたいですよね。今回はなるべく楽に実装を進められる方法を2つまとめたので紹介します。

日付のフォーマットを国毎に最適化する

 DateFormatterを利用するとDateを文字列にすることができます。dateFormatプロパティにyyyy/MM/ddなどの値を渡してstring(from:)を実行すると2020/09/10などの文字列を取得することができます。このyyyy/MM/ddの部分を画面に出す場合、国の慣習によって表記が異なることが多いです。マッピング表などを作って頑張れば国ごとに実装をすることも可能かもしれませんがこんな対応はしたくないですね。そういう場合にはDateFormatter.dateFormat(fromTemplate:options:locale:)を利用すると渡したlocaleに合わせた日付のフォーマットが返ってきます。
サンプルコード

let locale: Locale = .current
guard let dateFormat = DateFormatter.dateFormate(fromTemplate: “yyyy/MM/dd”, options: 0, locale: locale) else { return }
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = dateFormat
dateFormatter.locale = locale
let date = Date()
let string = dateFormatter.string(from: date)

余談ですがoptionsにはいつも0を渡してて他に何があるんだろうと思ったら特に何も無いみたいです。

日付の24時間表示・午前/午後表示、西暦・和暦に対応する

 iOSの設定アプリの日付と時刻から24時間表示と午前/午後表示を設定したり

画像1

言語と地域から暦法を変更することができます。

画像2

これらの設定によって、アプリの表記がおかしいなどの不具合にハマったことがある人もいるのではないでしょうか。ここに関するクラスはLocale(日付と時刻)とCalendar(暦法)です。特に強いこだわりが無い限りは、Localeはen_US_POSIXを利用すると良いと思います。(例: Locale(identifier: “en_US_POSIX”))これは強制的にアメリカの英語設定を利用するものです。参考
Calendarに関しては.gregorianを利用しておくと良いと思います。(例: Calendar(identifier: .greogiran))こちらは強制的に西暦を利用する設定です。
ものによってはそれぞれ別の値を利用することが必要なことがあるかもしれないので、盲目的に利用するのはオススメしないですが何か不具合が発生した際には思い出してみると良いと思います。

まとめ

 今回は2つだけでしたがSwiftで日付を便利に扱う方法を書いてみました。特にこの辺りは細かい調整がしたいわけじゃ無ければ苦しむことが多いのでは覚えておくと便利だと思います。

この記事が気に入ったらサポートをしてみませんか?