12/24-часовой режим конфликта

Я французский разработчик Android, поэтому использование Locale.getDefault() заставляет мой DateFormat использовать 24-часовой режим. Но когда я устанавливаю вручную свое устройство в 12-часовой режим через меню настроек, DateFormat продолжает DateFormat в 24-часовом формате.

Напротив, TimePicker s устанавливается в соответствии с моими 12/24-часовыми настройками.

Есть ли способ заставить DateFormat вести себя так же, как TimePicker ?

РЕДАКТИРОВАТЬ:

Вот моя декларация DateFormat :

 timeFormat = DateFormat.getTimeInstance(DateFormat.SHORT, Locale.getDefault()); 

И здесь я установил свой TimePicker в 12 или 24-часовой режим.

 tp.setIs24HourView(android.text.format.DateFormat.is24HourFormat((Context) this)); 

Мое решение:

В соответствии с ответом @Meno Hochschild ниже, вот как я решил эту сложную проблему:

 boolean is24hour = android.text.format.DateFormat.is24HourFormat((Context) this); tp.setIs24HourView(is24hour); // tp is the TimePicker timeFormat = DateFormat.getTimeInstance(DateFormat.SHORT, Locale.getDefault()); if (timeFormat instanceof SimpleDateFormat) { String pattern = ((SimpleDateFormat) timeFormat).toPattern(); if (is24hour) { timeFormat = new SimpleDateFormat(pattern.replace("h", "H").replace(" a",""), Locale.getDefault()); } else { timeFormat = new SimpleDateFormat(pattern.replace("H", "h"), Locale.getDefault()); } } 

После этого timeFormat будет правильно форматировать даты, будет ли ваше устройство настроено на отображение времени в 24-часовом формате или в 12-часовом формате. И TimePicker будет правильно установлен.

Если вы указали шаблон в SimpleDateFormat то вы установили 12/24-часовой режим, либо 12-часовой режим в случае символа шаблона «h» (1-12), либо 24-часового режима в случае символа шаблона «H» (0-23). Альтернативы «k» и «K» аналогичны альтернативным вариантам.

Тем не менее, указание шаблона делает ваш формат независимым от настройки устройства!

Альтернативой могло бы быть использование DateFormat.getDateTimeInstance (), которое делает стиль времени зависимым от системного языка (если Locale.getDefault() может измениться – или вам нужно развернуть механизм, как спросить текущий язык устройства, а затем установить на Android -Java Locale.setDefault() ).

Еще одна идея, характерная для Android, – это запросить непосредственно системные настройки с помощью строковой константы TIME_12_24, а затем указать шаблон, зависящий от этого параметра. Это также, по-видимому, возможно с помощью специального метода DateFormat.is24HourFormat () (обратите внимание на то, что Android имеет два разных класса с именем DateFormat ). Конкретный пример такого подхода:

 boolean twentyFourHourStyle = android.text.format.DateFormat.is24HourFormat((Context) this); DateFormat df = DateFormat.getTimeInstance(DateFormat.SHORT, Locale.getDefault()); if (df instanceof SimpleDateFormat) { String pattern = ((SimpleDateFormat) df).toPattern(); if (twentyFourHourStyle) { df = new SimpleDateFormat(pattern.replace("h", "H"), Locale.getDefault()); } else { df = new SimpleDateFormat(pattern.replace("H", "h"), Locale.getDefault()); } } else { // nothing to do or change } 

Вы, конечно, можете уточнить код для возможных вхождений k и K или следить за использованием литералов h и H (затем проанализировать апострофы, чтобы игнорировать такие части в методе замещения).

Исходное решение не всегда хорошо работает. Мое решение проще и элегантно:

Locale.US По умолчанию 12 часов, затем мы устанавливаем 12 часов.

Мы проверяем, проверен ли пользователь 24-часовой формат, затем мы устанавливаем Locale по умолчанию 24 часа.

 boolean twentyFourHourStyle = android.text.format.DateFormat.is24HourFormat(context); DateFormat timeFormat = DateFormat.getTimeInstance(DateFormat.SHORT, Locale.US); if (twentyFourHourStyle) { timeFormat = DateFormat.getTimeInstance(DateFormat.SHORT,Locale.FRANCE); } 

Решено с 3 линиями;)

Убедитесь, что вы используете правильный класс DateFormat.

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

Это правильно обновляется при изменении формата 12/24 в настройках.

Не использовать: java.text.DateFormat. Это не работает.

Например Дата Дата = новая дата (); Строковое время = android.text.format.DateFormat.getTimeFormat (контекст) .формат (дата);

Я понимаю, что это старая проблема, но я здесь, потому что DateFormat.getTimeInstance (DateFormat.SHORT) тоже не работал для меня. Это было прекрасно с API 26 (Android O) AVD, но он не работал с моими старыми устройствами API 16 и API 19 (Android 4). Поэтому похоже, что проблема – это просто ошибка с более старым кодом. Теперь я использую android.text.format.DateFormat.getTimeFormat () в сочетании с android.text.format.DateFormat.is24HourFormat (), чтобы получить правильный выбор времени. Это работает как на моем AVD, так и на моих старых устройствах.

Intereting Posts
Android-камера 2 Api FastScrollBar выходит из экрана, когда реализован разделIndexer Android получить изображение галереи Uri path Как изменить тему из другого ресурса приложения в Android? Файл загрузки HTTP-клиента Apache. Произошла какая-то странная ошибка сборки TCP Редактировать pdf для изменения заголовка Android.widget.ProgressBar не может быть добавлен в файл android.widget.LinearLayout Что такое «android: windowSoftInputMode» для веб-сайта? Android Studio – Gradle генерирует определенные файлы javadoc Реализация эффекта пульсации вне ImageButton Как скрыть значок действия share (который используется больше всего) рядом с поставщиком акций? Невозможно разобрать как целое Отключить Android AutoCompleteTextView после того, как пользователь выберет элемент из раскрывающегося списка Диаграмма классов UML: как моделировать отношения о вызове метода или начале действия или службы Как получить панель инструментов из фрагмента?