Cómo obtener el nombre checo del mes
Tengo un problema con obtener un nombre de mes en mi idioma – checo.
Quiero obtener el nombre del mes como sustantivo, pero siempre obtengo el título inflected. Intenté muchas maneras de conseguir el nombre, pero todas las maneras vuelven inflected el título del nombre del mes
- Android 7.0 Nougat recoge cadenas predeterminadas cuando el idioma del dispositivo es en_US
- Los números arábigos con ar-ae y ar-sa locale en Android
- Configuración de idioma turco e inglés: traducir caracteres turcos a equivalentes latinos
- Android obtiene el idioma del dispositivo
- Android: Cómo obtener una cadena en una configuración específica SIN cambiar la configuración actual
Por ejemplo quiero conseguir el nombre de octubre en el checo "Říjen", pero consigo siempre "října".
Calendar cal=Calendar.getInstance(); SimpleDateFormat month_date = new SimpleDateFormat("MMMMMMMMM"); String month_name = month_date.format(cal.getTime()); DateFormat formatData = new SimpleDateFormat("d.MMMM yyyy H:mm"); System.out.println(month_name); System.out.println(String.format(Locale.getDefault(),"%tB", cal)); System.out.println(formatData.format(cal.getTime()));
Todo devuelve mal formato para mí. ¿Hay alguna forma de obtener el nombre correcto del mes? Gracias
- Cómo configurar el texto del cuadro de diálogo de google api en el idioma predeterminado de la aplicación
- La mejor manera de determinar automáticamente el idioma del usuario
- Obtener el nombre del idioma en ese idioma desde el código de idioma
- ¿Por qué podría Resources.getString () devolver intermitentemente cadenas de la configuración regional equivocada?
- ¿Por qué Android tiene su propia manera de obtener la configuración actual?
- Android: cambia la programación del sistema del dispositivo mediante programación
- Android Cómo instalar los locales instalados del sistema
- Hablar con TTS como Hindi
Utilizar este código de ejemplo
public static void main(String[] args) { Calendar cal= Calendar.getInstance(); Locale loc = new Locale("cs", "CZ"); System.out.println(String.format(loc,"%tB", cal)); }
Recibo salida
íjen
Que se parece a lo que quieres (explícitamente Locale
tu Locale
).
Usted puede solucionar esto ya, pero aquí está la solución. Hice un poco de investigación y la razón es el cambio en java.text.DateFormatSymbols
en Java 8 (véase la guía de compatibilidad ).
Hay una diferencia entre el formato y las formas independientes. Formato de formularios: ledna, února, března, etc .; Formas autónomas: leden, únor, březen, etc.
También de acuerdo a las reglas de la lengua el nombre del mes cuando está solo comienza con el carácter más bajo, a menos que comience la oración.
Este código le proporcionará el resultado deseado.
public static void main(String[] args) { Calendar cal = Calendar.getInstance(); Locale loc = new Locale("cs", "CZ"); System.out.println(cal.getDisplayName(Calendar.MONTH, Calendar.LONG_STANDALONE, loc)); }
Al final encuentro la mejor solución para este problema. El problema es que el formato "MMMM" se utiliza para "nombre de formato" del mes (fe "ledna"). Si necesitas un "nombre independiente" del mes (fe "leden") debes usar "LLLL" en su lugar. La documentación completa del formato de fecha se puede encontrar aquí:
https://docs.oracle.com/javase/8/docs/api/java/text/SimpleDateFormat.html
Aquí está ejemplo sencillo:
DateFormat.format("LLLL yyyy", date).toString().capitalize() // returns: Leden
2016
y
DateFormat.format("MMMM yyyy", date).toString() // returns ledna 2016
Esta solución funciona para todos los API. Acepte esto como una respuesta correcta.
tl dr
Month.OCTOBER.getDisplayName ( TextStyle.FULL_STANDALONE , new Locale ( "cs", "CZ" ) )
říjen
Gracias a la respuesta de MikeX para mostrar esto es un problema de idioma "independiente". A diferencia del inglés, algunos idiomas como el checo alteran la ortografía del mes dependiendo del contexto de su uso.
Uso de java.time
El enfoque moderno utiliza las clases java.time. La pregunta y otras respuestas están obsoletas, utilizando las viejas y SimpleDateFormat
clases de fecha y hora ( Calendar
, SimpleDateFormat
, DateFormat
, etc.) que ahora son heredadas, suplantadas por las clases java.time. Consulte a continuación para el back-port de Android.
El enum Month
proporciona un método para localizar el nombre del mes: Month::getDisplayName
. Pase un TextStyle
indica full-narrow-short y si desea que el tipo independiente o combo.
Cuando se puede hacer un bucle a través de estos para ver todos los resultados posibles.
Locale locale = new Locale ( "cs", "CZ" ); for ( Month month : EnumSet.allOf ( Month.class ) ) { System.out.println ( "\nMonth: " + month ); for ( TextStyle textStyle : EnumSet.allOf ( TextStyle.class ) ) { String output = month.getDisplayName ( textStyle, locale ) + " | " + textStyle; System.out.println ( output ); } }
Month: JANUARY ledna | FULL leden | FULL_STANDALONE Led | SHORT I | SHORT_STANDALONE l | NARROW l | NARROW_STANDALONE Month: FEBRUARY února | FULL únor | FULL_STANDALONE Úno | SHORT II | SHORT_STANDALONE ú | NARROW ú | NARROW_STANDALONE Month: MARCH března | FULL březen | FULL_STANDALONE Bře | SHORT III | SHORT_STANDALONE b | NARROW b | NARROW_STANDALONE Month: APRIL dubna | FULL duben | FULL_STANDALONE Dub | SHORT IV | SHORT_STANDALONE d | NARROW d | NARROW_STANDALONE Month: MAY května | FULL květen | FULL_STANDALONE Kvě | SHORT V | SHORT_STANDALONE k | NARROW k | NARROW_STANDALONE Month: JUNE června | FULL červen | FULL_STANDALONE Čer | SHORT VI | SHORT_STANDALONE č | NARROW č | NARROW_STANDALONE Month: JULY července | FULL červenec | FULL_STANDALONE Čvc | SHORT VII | SHORT_STANDALONE č | NARROW č | NARROW_STANDALONE Month: AUGUST srpna | FULL srpen | FULL_STANDALONE Srp | SHORT VIII | SHORT_STANDALONE s | NARROW s | NARROW_STANDALONE Month: SEPTEMBER září | FULL září | FULL_STANDALONE Zář | SHORT IX | SHORT_STANDALONE z | NARROW z | NARROW_STANDALONE Month: OCTOBER října | FULL říjen | FULL_STANDALONE Říj | SHORT X | SHORT_STANDALONE ř | NARROW ř | NARROW_STANDALONE Month: NOVEMBER listopadu | FULL listopad | FULL_STANDALONE Lis | SHORT XI | SHORT_STANDALONE l | NARROW l | NARROW_STANDALONE Month: DECEMBER prosince | FULL prosinec | FULL_STANDALONE Pro | SHORT XII | SHORT_STANDALONE p | NARROW p | NARROW_STANDALONE
Acerca de java.time
El marco java.time está integrado en Java 8 y versiones posteriores. Estas clases suplantan las viejas clases de fecha y hora heredadas , como java.util.Date
, Calendar
y SimpleDateFormat
.
El proyecto Joda-Time , ahora en modo de mantenimiento , recomienda la migración a las clases java.time .
Para obtener más información, consulte el Tutorial de Oracle . Y busca Stack Overflow para muchos ejemplos y explicaciones. La especificación es JSR 310 .
Dónde obtener las clases java.time?
- Java SE 8 , Java SE 9 y posterior
- Incorporado.
- Parte de la API Java estándar con una implementación integrada.
- Java 9 agrega algunas características y correcciones menores.
- Java SE 6 y Java SE 7
- Gran parte de la funcionalidad de java.time se retroporta a Java 6 y 7 en ThreeTen-Backport .
- Androide
- El proyecto ThreeTenABP adapta específicamente a ThreeTen-Backport (mencionado anteriormente) para Android.
- Consulte Cómo utilizar ThreeTenABP ….
- Asegúrese de que el contenido de su adaptador no se ha modificado desde un subproceso de fondo, sino sólo desde el subproceso de interfaz de usuario
- Cordova Google-analytics-plugin con ionico en Android no funciona