要旨
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.DateUtils
android.text.format.DateFormat
java.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 件のコメント :
コメントを投稿