Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

378
Views
Personalizar una configuración regional en Java

En Java, el Locale define cosas que están relacionadas con cómo la gente quiere ver las cosas (como formatos de moneda, el nombre de los meses y cuándo comienza una semana).

Al analizar el nombre de un mes (con un DateTimeFormatter ) comienza a ser complicado.

Si usa Locale.US o Locale.ENGLISH , septiembre tiene la forma abreviada Sep .

Si usa Locale.UK , septiembre también tiene la forma abreviada Sep en Java 11 ... pero cuando prueba Java 17, tiene Sept (debido a los cambios en el final de Unicode CLDR por lo que pregunté si esto era correcto ).

El efecto es que mis pruebas comenzaron a fallar al intentar compilar con Java 17.

La razón por la que mi código actual usa Locale.UK en lugar de Locale.ENGLISH es porque en Java Locale.ENGLISH en realidad no es solo inglés sino también la forma estadounidense no ISO de definir una semana (usan el domingo como el primer día de la semana) . Quiero tenerlo de la manera ISO.

Simplemente:

  • WeekFields.ISO = WeekFields.of(Locale.UK) = WeekFields[MONDAY,4]
  • WeekFields.of(Locale.ENGLISH) = WeekFields.of(Locale.US) = WeekFields[SUNDAY,1]

Entonces, comenzando con Java 17, aún no he podido encontrar una configuración regional integrada que funcione correctamente.

En mi mente, tengo que tomar Locale.ENGLISH y cambiar WeekFields o tomar Locale.UK y cambiar el nombre corto del mes de septiembre a lo que necesito.

Mi pregunta es ¿cómo hago esto (en Java 17)?

¿O hay una mejor manera de arreglar esto?


Actualización 1:

  • Ya recibí comentarios de la gente de Unicode que indican que el cambio de en_GB para usar Sept en lugar de Sep es una corrección de errores porque esa es la forma en que debería abreviarse en el Reino Unido.

Así que parece que necesitaré no solo un analizador que acepte "Sep", sino uno que acepte una combinación de "Sept" y "Sep" para inglés.

Actualización 2:

  • He modificado mi código para que, en caso de una excepción de análisis, intente cambiar lo que se supone que es la entrada ("Sep") a lo que le gusta tener a la localización actualmente seleccionada. Esto no cubre todos los casos, cubre suficientes casos para mi situación específica. Para los interesados: mi commit .
over 4 years ago · Santiago Trujillo
1 answers
Answer question

0

Encontré una manera de manejar esto usando SPI.

Lo estoy documentando aquí como una posibilidad que puede funcionar para otros (no funciona para mi contexto).

Como experimento creé una clase:

 package nl.basjes.parse.httpdlog.dissectors.locale; import java.util.Locale; import java.util.spi.CalendarDataProvider; import static java.util.Calendar.MONDAY; public class CalendarDataProviderISO8601 extends CalendarDataProvider { public static final Locale ENGLISH_ISO = new Locale("en", "", "ISO"); @Override public int getFirstDayOfWeek(Locale locale) { return MONDAY; } @Override public int getMinimalDaysInFirstWeek(Locale locale) { return 4; } @Override public Locale[] getAvailableLocales() { return new Locale[]{ENGLISH_ISO}; } }

y un archivo ./src/main/resources/META-INF/services/java.util.spi.CalendarDataProvider con

 nl.basjes.parse.httpdlog.dissectors.locale.CalendarDataProviderISO8601

Debido a que esta es solo una variante del "inglés" sin región, tomará todo desde "inglés" y pondrá la clase anterior sobre él.

Aunque esto funciona, no puedo usarlo.

El problema es que aunque http://openjdk.java.net/jeps/252 describe The default lookup order will be CLDR, COMPAT, SPI, la realidad actual es que el SPI se eliminó de esta lista en este cambio debido a la deprecating the Extension Mechanism .

Entonces, para usar esta construcción, la clase debe estar en el classpath al inicio y la opción de línea de comando -Djava.locale.providers=CLDR,COMPAT,SPI debe pasarse a la JVM.

Dado que mi biblioteca ( https://github.com/nielsbasjes/logparser/ ) también se usa en situaciones (como Apache Flink/Beam/Drill/Pig) donde las clases se envían de una manera más dinámica (serializadas y transportadas a un ya ejecutando JVM) a varias máquinas, esta construcción no se puede utilizar.

Actualmente no conozco una forma dynamic de hacer algo como esto en Java.

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!