Как я могу установить форматирование даты и времени в Java, которое учитывает настройки ОС пользователя - PullRequest
13 голосов
/ 15 июля 2011

Я запускаю свое приложение Java на компьютере с Windows 7, где мои региональные настройки настроены на форматирование даты в формате ГГГГ-мм-дд и времени в формате ЧЧ: мм: сс (например, 2011-06-20 07:50:28" ).Но когда я использую DateFormat.getDateTimeInstance().format для форматирования даты, я не вижу, что вместо этого я получаю «20 июня 2011 7:50:28 AM».Что мне нужно сделать, чтобы форматировать даты так, чтобы у моих клиентов были настройки ОС для отображения дат?

Вот как выглядит мой код:

File selGameLastTurnFile = selectedGame.getLastTurn ().getTurnFile ();
Date selGameModifiedDate = new Date (selGameLastTurnFile.lastModified());
if (selectedGame.isYourTurn ())  {
    gameInfo = Messages.getFormattedString ("WhoseTurnIsIt.Prompt.PlayTurn",  //$NON-NLS-1$
            FileHelper.getFileName (selGameLastTurnFile), 
            DateFormat.getDateTimeInstance().format(selGameModifiedDate));
}  else  {
    gameInfo = Messages.getFormattedString ("WhoseTurnIsIt.Prompt.SentTurn",  //$NON-NLS-1$
            selGameLastTurnFile.getName (), 
            DateFormat.getDateTimeInstance().format(selGameModifiedDate));
}

The Messages.getFormattedString звонки используют MessageFormat, чтобы поместить дату в предложение, которое будет выглядеть следующим образом:

Сыграть на терне «QB Nat vs Ian 008» (получено 20 июня 2011 г. 7:50).: 28:00)

Однако настройки моей ОС настроены на форматирование даты, как я описал выше, и я ожидал увидеть это:

Воспроизвести ход 'QB Nat vsЯн 008 '(получено 2011-06-20 07:50:28)

Я искал здесь и на других сайтах по программированию на Java и не смог найти ответ, но это кажется такой очевидной вещью, которую хочетсяя чувствую, что упускаю что-то очевидное.

Ответы [ 7 ]

8 голосов
/ 15 июля 2011

Сначала вы должны сказать Java, как выглядит ваша система LOCALE.

Проверьте систему Java.
String locale = System.getProperty("user.language")

А затем отформатируйтедата по согласованию (SimpleDateFormat)
SimpleDateFormat(String pattern, Locale locale)

Обратитесь к практическому коду Java для рабочего примера ...

String systemLocale = System.getProperty("user.language");
String s;
Locale locale; 

locale = new Locale(systemLocale );
s = DateFormat.getDateInstance(DateFormat.MEDIUM, locale).format(new Date());
System.out.println(s);
// system locale is PT outputs 16/Jul/2011

locale = new Locale("us");
s = DateFormat.getDateInstance(DateFormat.MEDIUM, locale).format(new Date());
System.out.println(s);
// outputs Jul 16, 2011

locale = new Locale("fr");
s = DateFormat.getDateInstance(DateFormat.MEDIUM, locale).format(new Date());
System.out.println(s);
// outputs 16 juil. 2011  
4 голосов
/ 11 февраля 2019

Oracle JDK 8 полностью поддерживает форматирование с использованием пользовательских региональных настроек ОС.

Просто установить системное свойство java.locale.providers=HOST

Согласно https://docs.oracle.com/javase/8/docs/technotes/guides/intl/enhancements.8.html:

HOST представляет настройку текущего пользователя базового настройки операционной системы. Работает только по умолчанию пользователя Язык и настраиваемые параметры могут различаться в зависимости от ОС, но в основном поддерживаются форматы даты, времени, числа и валюты.

Фактическая реализация этого форматера доступна в классе sun.util.locale.provider.HostLocaleProviderAdapterImpl. Если использование системного свойства недопустимо (скажем, вы не хотите влиять на все приложение), можно напрямую использовать этот класс провайдера. Класс является внутренним API, но к нему можно обратиться с помощью отражения:

private static DateFormat getSystemDateFormat() throws ReflectiveOperationException {
        Class<?> clazz = Class.forName("sun.util.locale.provider.HostLocaleProviderAdapterImpl");
        Method method = clazz.getMethod("getDateFormatProvider");
        DateFormatProvider dateFormatProvider = (DateFormatProvider)method.invoke(null);
        DateFormat dateFormat = dateFormatProvider.getDateInstance(DateFormat.MEDIUM, Locale.getDefault(Locale.Category.FORMAT));
        return dateFormat;
    }
4 голосов
/ 22 марта 2018

Я нашел этот класс утилит Java от JetBrains, который извлекает все пользовательские настройки локали из ОС (как из Windows, так и из Mac) и выполняет для вас правильное форматирование:

https://github.com/JetBrains/intellij-community/blob/master/platform/util/src/com/intellij/util/text/DateFormatUtil.java

Он под лицензией Apache 2.0, так что вы, вероятно, можете использовать его в своем проекте.

4 голосов
/ 19 июля 2011

Вы не можете сделать это на чистой Java.Sun / Oracle не может сделать эту систему независимой.

Быстрый просмотр библиотек .NET дает эту страницу - чтобы процитировать:

пользователь может переопределить некоторые значения, связанные с текущей культурой Windows, в разделе региональных и языковых параметров панели управления.Например, пользователь может выбрать отображение даты в другом формате или использовать валюту, отличную от значения по умолчанию для культуры.Если для свойства CultureInfo.UseUserOverride установлено значение true, свойства объекта CultureInfo.DateTimeFormat, объекта CultureInfo.NumberFormat и CultureInfo.TextInfo также извлекаются из пользовательских настроек.

IЯ бы посоветовал вам сделать это способом, зависящим от системы Windows, если вам нужны эти функции (например, получить доступ к реестру Windows, как предложено @laz).

3 голосов
/ 19 июля 2011

Похоже, для этого вам понадобится доступ к реестру Windows. См. Этот вопрос для различных решений для этого чтение / запись в реестр Windows с использованием Java .

После того, как вы выберете один из многих методов доступа к реестру, вам потребуется получить из реестра правильный ключ для формата. В этом документе указан ключ для использования HKEY_USERS\.Default\Control Panel\International.

При использовании GNOME в Linux вы можете использовать команду gconftool, аналогичную команде reg для Windows, как упомянуто в предыдущих ссылках о реестре Windows. Я вижу ключ /apps/panel/applets/clock_screen0/prefs/custom_format в моей конфигурации, хотя он пустой, поскольку я использую значение по умолчанию:

gconftool -g /apps/panel/applets/clock_screen0/prefs/custom_format

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

В Mac OS я не уверен, что вы будете делать.

1 голос
/ 02 апреля 2019
java -Djava.locale.providers=HOST,CLDR,COMPAT YourProgram

Форматы даты и времени являются частью данных локали Java. Java может получать данные о локали из четырех источников. Какие из них используются, определяется системным свойством java.locale.providers. По умолчанию до Java 8 было JRE,SPI. С Java 9 это CLDR,COMPAT. Ни один из них не даст вам данные о дате и времени из операционной системы, но вы можете получить их, указав поставщика HOST locale, например, как в командной строке выше. При запуске вашей программы с этим определением свойства, например, вы можете иметь:

    DateTimeFormatter systemFormatter
            = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.FULL);
    ZonedDateTime now = ZonedDateTime.now(ZoneId.of("Africa/Bangui"));
    String formattedDateTime = now.format(systemFormatter);
    System.out.println(formattedDateTime);

Будет напечатана текущая дата и время в формате, определенном базовой операционной системой. Если операционная система поддерживает это, вы можете изменять длину вывода, используя стили форматов FULL, LONG, MEDIUM и SHORT.

В большинстве случаев вам нужно, чтобы DateTimeFormatter знал формат, как в приведенном выше коде. В редком случае, когда вы хотите узнать строку шаблона формата, это также возможно:

    String osFormat = DateTimeFormatterBuilder.getLocalizedDateTimePattern(
            FormatStyle.SHORT, FormatStyle.LONG, IsoChronology.INSTANCE, Locale.getDefault());

Первый аргумент getLocalizedDateTimePattern - это стиль формата date . Второй стиль - время .

1 голос
/ 15 июля 2011

Возможно, я неправильно понимаю, что вы здесь делаете, но вам нужно использовать локаль.

 DateFormat df = DateFormat.getDateInstance(DateFormat.LONG, Locale.FRANCE);

Используя Locale, вы можете контролировать, какой формат для какого региона вы используете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...