Форматирование даты и времени в зависимости от языка

Я новичок в разработке Java и Android, так что это может быть глупый вопрос, но я искал несколько дней и не могу найти решение:

Я пытаюсь вывести файл java.util.Date зависимости от локали пользователя.

Поиск по StackOverflow привел меня к следующему:

 java.util.Date date = new Date(); String dateString = DateFormat.getDateFormat(getApplicationContext()).format(date); 

Эти результаты:

 20/02/2011 

На моем французском локализованном телефоне. Почти прекрасно.

Как я могу также вывести часы, минуты и секунды частей Date , используя локаль пользователя? Я смотрел в документации по Android, но ничего не мог найти.

Большое спасибо.

Использовать android.text.format.DateFormat.getTimeFormat()

Ref: http://developer.android.com/reference/android/text/format/DateFormat.html

ТЛ; др

 ZonedDateTime.now( ZoneId.of( "Asia/Kolkata" ) ) .format( DateTimeFormatter.ofLocalizedDateTime ( FormatStyle.FULL ).withLocale ( Locale.FRENCH ) ) 

java.time

Код в Вопросе использует неприятные старые классы времени, теперь устаревшие, вытесненные классами java.time, встроенными в Java 8 и более поздние версии.

Язык и часовой пояс не имеют ничего общего друг с другом. Locale определяет человеческий язык и культурные нормы, используемые при создании строки для представления значения даты и времени. Часовой пояс определяет время настенной шкалы для конкретной области, используемой для представления момента на временной шкале.

Класс Instant представляет момент на временной шкале в UTC с разрешением наносекунд (до девяти (9) цифр десятичной дроби).

 Instant instant = Instant.now(); 

2016-10-12T07: 21: 00.264Z

Примените часовой пояс, чтобы получить ZonedDateTime . Я произвольно хочу показать этот момент, используя часовой пояс в Индии. Тот же момент, та же точка на временной шкале.

 ZoneId z = ZoneId.of( "Asia/Kolkata" ); ZonedDateTime zdt = instant.atZone( z ); 

2016-10-12T12: 51: 00,264 + 05: 30 [Азия / Калькутта]

Создайте строку, используя языковой стандарт Québec Canada. Пусть java.time автоматически локализует строку.

 Locale l = Locale.CANADA_FRENCH; DateTimeFormatter f = DateTimeFormatter.ofLocalizedDateTime ( FormatStyle.FULL ).withLocale ( l ); String output = zdt.format ( f ); // Indian time zone with Québécois presentation/translation. 

Mercredi 12 октябрь 2016 12 ч 51 IST


О java.time

Рамка java.time встроена в Java 8 и более поздних версий . Эти классы вытесняют неприятные старые устаревшие классы времени, такие как java.util.Date , java.text.SimpleDateFormat и java.text.SimpleDateFormat .

Проект Joda-Time , теперь в режиме обслуживания , советует перейти на java.time.

Дополнительную информацию можно найти в учебнике Oracle . И поиск Stack Overflow для многих примеров и объяснений. Спецификация – JSR 310 .

Где получить классы java.time?

  • Java SE 8 и SE 9 и более поздние версии
    • Встроенный.
    • Часть стандартного Java API с интегрированной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и SE 7
    • Большая часть функциональных возможностей java.time портирована на Java 6 и 7 в ThreeTen-Backport .
  • Android
    • Проект ThreeTenABP адаптирует ThreeTen-Backport (упомянутый выше) специально для Android.
    • См. Как использовать ….

Проект ThreeTen-Extra расширяет java.time с дополнительными классами. Этот проект является доказательством возможных будущих дополнений к java.time. Здесь вы можете найти полезные классы, такие как Interval , YearWeek , YearQuarter и т . Д.

java.text.DateFormat имеет все функции, которые вам могут понадобиться:

DateFormat.getDateInstance()

DateFormat.getTimeInstance()

Но тот, который вам нужен:

DateFormat.getDateTimeInstance() Вы также можете указать длину части даты / времени и локали. Конечным результатом будет:

DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.SHORT, Locale.FRENCH).format(Date);

Источник: http://docs.oracle.com/javase/7/docs/api/java/text/DateFormat.html

DateFormat.getTimeInstance() получает формат времени со стилем форматирования по умолчанию для языкового стандарта по умолчанию. Вы также можете передать стиль и Locale .

 public static String formatDate(Date date, boolean withTime) { String result = ""; DateFormat dateFormat; if (date != null) { try { String format = Settings.System.getString(context.getContentResolver(), Settings.System.DATE_FORMAT); if (TextUtils.isEmpty(format)) { dateFormat = android.text.format.DateFormat.getDateFormat(context); } else { dateFormat = new SimpleDateFormat(format); } result = dateFormat.format(date); if (withTime) { dateFormat = android.text.format.DateFormat.getTimeFormat(context); result += " " + dateFormat.format(date); } } catch (Exception e) { } } return result; } 

Если вам нужны часы секунд и миллисекунд текущей локали, используйте Calendar.getInstance (). GetTime () предоставит вам время текущей локали