>我需要验证用户输入的日语日期。
假设用户选择ERA
->输入 DOB 作为YY - MM - dd
格式。
在服务器端,我接收用户选择的input date
和ERA
。
现在我需要使用选定的 ERA 验证输入的日期,如果该日期是否属于特定 ERA 的时间段。
我知道 Java 日历 API 中对此有支持,也有类 JapaneseImperialCalendar
,但我无法知道如何使用它,尽管它在内部使用它。
这就是我到现在为止所做的。
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());
}
输出
4
{??=3, ??=4, ??=2, ??=1, ??=0}
It is year 0026 of the current era
The calendar class is: java.util.JapaneseImperialCalendar
假设用户输入,所选 ERA 为SHOWA
,预期周期为 1926–1989
YY MM DD
34 05 28 // which is valid date
再
YY MM DD
62 12 28 // which should be invalid date
因此需要构建一些逻辑来验证用户输入日期与 ERA
首先:
now.getDisplayNames(Calendar.ERA, Calendar.LONG, locale)
返回给定区域设置中的显示名称,在本例中为日语。因此,您获得的??
标记是时代的有效日语名称,只是您的控制台无法打印它们。更改为
now.getDisplayNames(Calendar.ERA, Calendar.LONG, new Locale("en"))
你会得到一个很好的
{Heisei=4, Taisho=2, Meiji=1, Showa=3}
Java Calendar
不会验证您是否"合理"地设置了与纪元对应的字段,但您可以请求对给定纪元中的日历实例进行Calendar#getActualMaximum(YEAR)
,以获得最大合理年份。然后,您可以切换到该年以查找最大合理月份,并重复以查找最大合理日期。
这里有一个小展示:
public static void main(String[] args) {
Locale locale = new Locale("ja", "JP", "JP");
Calendar now = Calendar.getInstance(locale);
Map<String, Integer> eras = now.getDisplayNames(Calendar.ERA, Calendar.LONG, new Locale("en"));
for (Map.Entry<String, Integer> era : eras.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));
}
}
指纹
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