Лучший / рекомендуемый способ конвертировать Java 8 OffsetDateTime в локализованную строку на Android - PullRequest
2 голосов
/ 11 мая 2019

Я конвертирую свое приложение Android для использования новых классов даты и времени Java 8, используя ThreeTen-Backport вместо устаревшего класса Java Date.

Каков наилучший / рекомендуемый способ форматирования даты и времени для представления пользователю в соответствии с предпочтениями пользователя Android?При использовании класса Date я использовал DateFormat следующим образом:

DateFormat.getDateFormat(context).format(new Date()) // for date
DateFormat.getTimeFormat(context).format(new Date()) // for time

Эти методы получают Date в качестве параметра.Должен ли я продолжать использовать их, конвертировав мои OffsetDateTime в Date или есть лучший способ сделать это?

1 Ответ

3 голосов
/ 12 мая 2019

org.threeten.bp.format

Забудьте о DateFormat & Date. Эти ужасные классы были полностью заменены много лет назад принятием JSR 310 .

См. Пакет org.threeten.bp.format.

DateTimeFormatter

В частности, посмотрите на класс DateTimeFormatter и его методы ofLocalized….

Для получения дополнительной информации ищите эквивалентные классы из java.time . Форматирование уже было рассмотрено много-много раз. API и функциональность будут практически идентичны, поэтому будут применяться существующие посты.

ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime zdt = ZonedDateTime.now( z ) ;

Locale l = Locale.CANADA_FRENCH ; 
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDate( FormatStyle.MEDIUM ).withLocale( l ) ;
String output = zdt.format( f ) ;

11 мая 2019

Использование значений по умолчанию

Если вы хотите использовать текущие значения по умолчанию JVM для часового пояса или для локали , я предлагаю вам сделать это явно. Таким образом, любой, кто читает ваш код, знает, что вы рассмотрели проблемы зоны / локали и сознательно решил использовать значение по умолчанию.

ZoneId z = ZoneId.systemDefault() ;
ZonedDateTime zdt = ZonedDateTime.now( z ) ;

Locale l = Locale.getDefault() ; 
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDate( FormatStyle.MEDIUM ).withLocale( l ) ;
String output = zdt.format( f ) ;
...