要旨
Android で日時(日付、時刻)を扱う際、「国際化(i18n)された日時の書式化」は避けて通れない話題である。
Android で日時表示を書式化する方法 (API) は複数存在するため、比較した。
結論
日時書式に「細やかな書式指定」と「国際化対応(i18n)」の両方が必要ならば、
android.text.format.DateFormat の getBestDateTimePattern() が便利。
※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)
android.text.format.DateUtilsandroid.text.format.DateFormatjava.text.SimpleDateFormat(Java 6, Java 7, Java 8)java.text.DateFormatSymbols(Java 6, Java 7, Java 8)java.text.DateFormat(Java 6, Java 7, Java 8)java.util.Formatter(Java 6, Java 7, Java 8)- Using Predefined Formats (The Java™ Tutorials > Internationalization > Formatting)
- Customizing Formats (The Java™ Tutorials > Internationalization > Formatting)
- SimpleDateFormat (ICU4J 58.2)
- FastDateFormat (Apache Commons Lang 3.5 API)
- DateTimeFormat (Joda time 2.2 API)
- UTS #35: Unicode Locale Data Markup Language > Appendix F: Date Format Patterns
- UTS #35: Unicode LDML: Dates
- Date/Time Symbols - CLDR - Unicode Common Locale Data Repository
- Date/Time Patterns - CLDR - Unicode Common Locale Data Repository
- DateTimeFormatter (Java Platform SE 8 )
- DateTimeFormatterBuilder (Java Platform SE 8 )
- ISO 8601 - Wikipedia
0 件のコメント :
コメントを投稿