Формат даты с локалью

Я хочу отображать дату в соответствии с форматом даты каждой страны. Я пробовал много способов, наконец, я нашел этот пример

http://www.java2s.com/Code/Java/Data-Type/DateFormatwithLocale.htm

Что дает идеальный результат того, что я имел в виду. В некоторых странах, таких как Германия, не используются 12-часовые форматы, вместо этого используются 24-часовые форматы без без AM/PM. Хотя в некоторых странах, таких как США, используются 12-часовые форматы.

Но я обнаружил, что при запуске этого класса Java он возвращает правильный вывод, как и ожидалось, но при запуске этого внутри проекта Android он возвращает что-то вроде этого

I/System.out: Locale: en_US
I/System.out: Jan 23, 2018 5:26:41 AM
I/System.out: Jan 23, 2018 5:26:41 AM
I/System.out: Jan 23, 2018 5:26:41 AM
I/System.out: Jan 23, 2018 5:26:41 AM
I/System.out: Jan 23, 2018 5:26:41 AM
I/System.out: Locale: de_DE
I/System.out: 23.01.2018 5:26:41 vorm.
I/System.out: 23.01.2018 5:26:41 vorm.
I/System.out: 23.01.2018 5:26:41 vorm.
I/System.out: 23.01.2018 5:26:41 vorm.
I/System.out: 23.01.2018 5:26:41 vorm.

В случае Locale: en_US это ожидаемо, но в случае Locale: de_DE ожидается, что этого «ворма» не будет.

Кто-нибудь может объяснить такое поведение?


person Adhithya G Nair    schedule 23.01.2018    source источник
comment
5:26 — это то же самое, что 5:26 в 24-часовом формате, 17:26 — 17:26 в 24-часовом формате.   -  person Laurens    schedule 23.01.2018
comment
Но я не хочу, чтобы этот «ворм» отображался. если в случае 17:30 будет отображаться 17:30 нахм, мне просто нужно, чтобы это было 17:30   -  person Adhithya G Nair    schedule 23.01.2018
comment
начм. по-немецки PM, vorm. для утра. Поведение ожидаемое! Взгляните на эту ссылку, localeplanet.com/icu/de-DE/index .html   -  person Sameer Khan    schedule 23.01.2018
comment
Не являясь носителем немецкого языка, я полностью согласен с тем, что vorm. для AM и nach,. для PM выглядит странно и очень не по-немецки (как вы пишете с большой буквы Ungerman< /i>?) Я тоже ожидал бы только 5:26:41 (или 17:26:41, если время было в PM).   -  person Ole V.V.    schedule 23.01.2018
comment
@ОлеВ.В. Да ты прав..   -  person Adhithya G Nair    schedule 23.01.2018
comment
Здесь есть интересный ответ на повторяющийся вопрос.   -  person Ole V.V.    schedule 07.02.2018
comment
Oyye.. Спасибо за обновление @OleV.V. , это правильно   -  person Adhithya G Nair    schedule 07.02.2018


Ответы (3)


Это собственное поведение в java JDK.

В зависимости от действительного языкового стандарта, который вы передаете, JDK предоставляет время с отформатированной датой.

Возвращает новый экземпляр DateFormat, который форматирует дату с заданным стилем форматирования для указанной локали.

Parameters:
style the given formatting style. Either one of DateFormat.SHORT, 
DateFormat.MEDIUM, DateFormat.LONG, or DateFormat.FULL.
locale the desired locale.
Returns: a date formatter.
Throws: java.lang.IllegalArgumentException if style is invalid, or if locale isn't 
one of the locales returned from getAvailableLocales().
java.lang.NullPointerException if locale is null
See also: java.text.DateFormat.getDateInstance(int,java.util.Locale)

http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8-b132/java/text/spi/DateFormatProvider.java#DateFormatProvider.getTimeInstance%28int%2Cjava.util.Locale%29

person Takermania    schedule 23.01.2018
comment
Если это нативное поведение, то почему в Java и Android получается два разных вывода? - person Adhithya G Nair; 23.01.2018

    LocalDateTime dateTime = LocalDateTime.of(2018, 1, 23, 5, 26, 41);
    DateTimeFormatter formatter = DateTimeFormatter
            .ofLocalizedDateTime(FormatStyle.MEDIUM)
            .withLocale(Locale.GERMAN);
    System.out.println(dateTime.format(formatter));

Отпечатки

23.01.2018, 05:26:41

Правда, на Android не проверял, но думаю, что результат будет таким же.

Java.время

Классы Date и DateFormat, используемые на странице java2s, на которую вы ссылаетесь, давно устарели, и последний, в частности, также заведомо проблематичен. Только по этой причине я рекомендую вам прекратить их использование и вместо этого начать использовать java.time, современный API даты и времени Java. С ним намного приятнее работать.

Вы можете сделать это на Android? Вы, конечно, можете. Мне сказали, что java.time встроен в новые устройства Android. Для более старых устройств добавьте ThreeTenABP в свой проект (см. ссылки внизу) и обязательно импортируйте org.threeten.bp.LocalDateTime, org.threeten.bp.format.DateTimeFormatter и org.threeten.bp.format.FormatStyle. Тогда все будет работать.

Что пошло не так?

Java получает информацию о локали из разных источников. Он различается между Java для настольных компьютеров и Android Java, он может даже различаться между устройствами Android и между версиями Java. Без каких-либо гарантий, я думаю, что java.time более стабилен в этом отношении, чем старые классы.

Ссылки

person Ole V.V.    schedule 23.01.2018
comment
В.В., Привет, он отлично работает даже в Android. Но проблема в том, что он может ориентироваться только на API 26 или выше, то есть только на Android O или выше. Но минимальный API моего проекта - 21. Поэтому я не могу его использовать. - person Adhithya G Nair; 24.01.2018
comment
Я думаю, что вы можете использовать ThreeTenABP на уровне 21. Я ошибаюсь? Не мое родное поле, извините… - person Ole V.V.; 24.01.2018

Наконец-то я нашел ответ.. :) Спасибо Оле В.В.

Вот оно: Java DateFormat.SHORT в Android не работает должным образом

person Adhithya G Nair    schedule 07.02.2018