日本日期验证 - 比较

Ank*_*hal 6 java locale calendar date

我需要验证用户输入的日期日期.

假设用户选择ERA- >输入DOB作为YY - MM - dd格式.

在服务器端,我接收input dateERA由用户选择的.

现在我需要验证所选ERA的输入日期,如果日期属于特定ERA期间.

我知道在Java Calendar 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());
    }
Run Code Online (Sandbox Code Playgroud)

产量

4
{??=3, ??=4, ??=2, ??=1, ??=0}
It is year 0026 of the current era
The calendar class is: java.util.JapaneseImperialCalendar
Run Code Online (Sandbox Code Playgroud)

假设用户输入,选择ERA SHOWA,预期期限为1926–1989

YY   MM    DD
34   05    28  // which is valid date
Run Code Online (Sandbox Code Playgroud)

再次

YY   MM    DD
62   12    28  // which should be invalid date
Run Code Online (Sandbox Code Playgroud)

因此需要构建一些逻辑来验证ERA的用户输入日期

Ada*_*lik 4

首先:

now.getDisplayNames(Calendar.ERA, Calendar.LONG, locale)
Run Code Online (Sandbox Code Playgroud)

返回给定区域设置中的显示名称,在您的情况下是日语。因此,??您获得的标记是有效的日本时代名称,只是您的控制台无法打印它们。改成

now.getDisplayNames(Calendar.ERA, Calendar.LONG, new Locale("en"))
Run Code Online (Sandbox Code Playgroud)

你会得到一个很好的

{Heisei=4, Taisho=2, Meiji=1, Showa=3}
Run Code Online (Sandbox Code Playgroud)

JavaCalendar不会验证您是否“合理”地设置与时代相对应的字段,但您可以请求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));
    }
}
Run Code Online (Sandbox Code Playgroud)

印刷

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
Run Code Online (Sandbox Code Playgroud)