JVM поддерживает свою собственную текущую локаль по умолчанию. Это поведение требуется спецификациями Java.
Обычно реализация JVM определяет, какая ОС хоста установлена по умолчанию при запуске JVM, и использует ее в качестве своей собственной настройки по умолчанию. Дальнейшее изменение текущего значения по умолчанию в операционной системе хоста не влияет на JVM. Это поведение не , указанное в спецификации Java.
Обычно вы можете переопределить это поведение, указав локаль по умолчанию в командной строке, используемой для запуска JVM. Вы сказали, что пытались это сделать, но не объяснили, почему это не решение. Это поведение не указано в спецификации Java.
Внешний мониторинг и манипулирование
Вы можете внешне контролировать и манипулировать языковым стандартом в Java, открыв некоторый путь связи.
JMX приходит на ум.
Внешний вид
Когда ваше приложение запускается, оно может найти во внешнем источнике идею о том, какую локаль использовать, а затем сделать это единым целым в вашем приложении.
Сервер LDAP является одним из таких внешних мест для хранения таких значений. Вы бы использовали JNDI в Java для доступа к серверу и получения значения.
Звоните Locale.setDefault
Вызов Locale.setDefault
немедленно влияет на весь код во всех приложениях в JVM. Но это не сохраняется. При перезапуске приложения или JVM вы должны позвонить снова.
Любой другой код может вызывать как этот код, так и ваш код, что делает его ненадежным. Я не рекомендую такой подход.
Вы можете жестко закодировать нужный Locale
, объявив переменную статического класса.
static final public Locale LOCALE = Locale.ITALY ;
В коде жизненного цикла, который вызывается при запуске приложения, звоните Locale.setDefault( SomeClass.LOCALE ) ;
.
Pass Locale
объект в вашем коде
suggest Я предлагаю всегда явно указывать Locale
в качестве необязательного аргумента в различных местах, которые вас интересуют.
ZoneId z = ZoneId.of( "America/Montreal" ) ;
LocalDate today = LocalDate.now( z ) ;
Locale locale = Locale.CANADA_FRENCH ; // Pass explicitly your desired/expected `Locale`.
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDate( FormatStyle.FULL ).withLocale( locale ) ;
String output = today.format( f ) ;
Марди 11 июня 2019
В зависимости от текущего языка по умолчанию JVM ненадежен. Как программист, вы зависите от внешних факторов, которыми не можете управлять.
- Системный администратор или конечный пользователь могут изменить настройки по умолчанию при развертывании.
- Любой код в любом потоке любого приложения или библиотеки в JVM, вызывающем
Locale.setDefault
, немедленно влияет на ваш код.
Кстати, то же самое относится и к часовому поясу, ZoneId
. Лучше всегда явно передавать желаемый / ожидаемый часовой пояс.
Кроме того, если локаль или часовой пояс имеют решающее значение, лучше всего подтвердить это пользователем.