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