2017年4月2日日曜日

Android での日時の書式化: 日時書式化 API の比較

要旨

Android で日時(日付、時刻)を扱う際、「国際化(i18n)された日時の書式化」は避けて通れない話題である。

Android で日時表示を書式化する方法 (API) は複数存在するため、比較した。

結論

日時書式に「細やかな書式指定」と「国際化対応(i18n)」の両方が必要ならば、
android.text.format.DateFormatgetBestDateTimePattern() が便利。
※Java の標準API に同名のクラス (java.text.DateFormat) があるが、別物。

なお、getBestDateTimePattern() は「added in API level 18」であるため、Android 4.3 (JELLY_BEAN_MR2) 以上でなければ、利用できない。

また、getBestDateTimePattern()自体は 単独で書式化機能を持たない ため、java.text.SimpleDateFormat と組み合わせて使用する。


参考: 各 日時書式化API の寸評 (私見)

日時書式化の API細やかな
書式指定
国際化対応
(i18n)
必要な
API Level
DateUtils.formatDateTime()△: 少し荒い○: 3+
java.text.SimpleDateFormat△: 弱い○: 1+
DateFormat.getBestDateTimePattern()
+ java.text.SimpleDateFormat
△: 18+
DateUtils.formatDateTime()
国際化に対応しており、flags引数で 書式のオプションも指定できるが、「秒」や「ミリ秒」の表示指定はできない。
java.text.SimpleDateFormat
二通りの使用方法があるが、いずれにしても「帯に短し襷に長し」の感あり。
  • getDateTimeInstance() に「SHORT」「MEDIUM」「LONG」「FULL」を指定してインスタンスを得る場合、国際化対応はされるが、細やかな書式の指定はできない。
    (4パターンからしか選べず、その内容も実装依存である)
  • SimpleDateFormat のコンストラクタ等で、パターン文字列を指定してインスタンスを得る場合、日時の表示書式を細かく指定できるが、逆に言えば指定した書式の通りにしか書式化されない。
    (日時表示の国際化で重要な、ロケール別の「日時要素の出現順変更」は困難)
DateFormat.getBestDateTimePattern() + SimpleDateFormat
  • 「どの日時要素を表示するか」(= 細やかな書式指定) を指定できる。 さらに、
  • 「どの順序で日時要素を表示するか」(= 国際化対応) については、
    API 側で「対象ロケール適した出現順序」に並び替えてくれる。
  • ただし API レベルに制限があり、Android 4.2.2 以前の端末もサポートする必要があるならば、なんらかの代替手段が必要。

参考文献 (URL)


関連のある投稿

0 件のコメント :

コメントを投稿