new gregorian convertir año java date calendar locale

java - gregorian - Validación de fecha japonesa-Comparación



new calendar java (1)

Necesito validar la fecha japonesa ingresada por el usuario.

Digamos que el usuario selecciona ERA -> Ingrese fecha de nacimiento como formato YY - MM - dd .

En el lado del servidor, recibo input date y el ERA seleccionado por el usuario.

ahora necesito validar la fecha ingresada con la ERA seleccionada, si la fecha cae en el período de ERA particular o no.

Sé que hay soporte para esto en Java Calendar API. También existe la clase JapaneseImperialCalendar , pero no puedo obtener ninguna pista sobre cómo usarlo, aunque lo usa internamente.

Esto es lo que hice hasta ahora.

public static void main(String[] args) { Locale locale = new Locale("ja", "JP", "JP"); Calendar now = Calendar.getInstance(locale); System.out.println(now.get(Calendar.ERA)); Map<String, Integer> names = now.getDisplayNames(Calendar.ERA, Calendar.LONG, locale); System.out.println(names); System.out.printf("It is year %tY of the current era%n", now); System.out.printf("The calendar class is: %s%n", now.getClass().getName()); }

salida

4 {??=3, ??=4, ??=2, ??=1, ??=0} It is year 0026 of the current era The calendar class is: java.util.JapaneseImperialCalendar

supongamos que el usuario ingresa, la ERA seleccionada es SHOWA , el período esperado es 1926–1989

YY MM DD 34 05 28 // which is valid date

de nuevo

YY MM DD 62 12 28 // which should be invalid date

Por lo tanto, es necesario construir una lógica para validar la fecha de entrada del usuario con ERA


Primero que nada: el

now.getDisplayNames(Calendar.ERA, Calendar.LONG, locale)

devuelve los nombres para mostrar en la configuración regional dada, que en su caso es japonesa. Entonces el ?? las marcas que obtienes son nombres japoneses válidos de las eras, es solo que tu consola no puede imprimirlas. Cambiar a

now.getDisplayNames(Calendar.ERA, Calendar.LONG, new Locale("en"))

y obtendrás un buen

{Heisei=4, Taisho=2, Meiji=1, Showa=3}

Java Calendar no valida si está configurando los campos "razonablemente" correspondientes a la era, pero puede solicitar Calendar#getActualMaximum(YEAR) en una instancia de un calendario en una época determinada para obtener el año razonable máximo. Luego, puede cambiar a ese año para encontrar el mes razonable máximo y repetir para encontrar el día máximo razonable.

Aquí hay un pequeño escaparate:

public static void main(String[] args) { Locale locale = new Locale("ja", "JP", "JP"); Calendar now = Calendar.getInstance(locale); Map<String, Integer> ears = now.getDisplayNames(Calendar.ERA, Calendar.LONG, new Locale("en")); for (Map.Entry<String, Integer> era : ears.entrySet()) { Integer eraIndex = era.getValue(); String eraName = era.getKey(); System.out.printf("Era #%d [%s]%n", eraIndex, eraName); now.set(Calendar.ERA, eraIndex); now.set(Calendar.YEAR, 1); now.set(Calendar.DAY_OF_YEAR, 1); System.out.printf("Actual max year in era is %d%n", now.getActualMaximum(Calendar.YEAR)); } }

huellas dactilares

Era #4 [Heisei] Actual max year in era is 292277005 // current era Era #2 [Taisho] Actual max year in era is 15 Era #1 [Meiji] Actual max year in era is 44 Era #3 [Showa] Actual max year in era is 63