2014-12-22 2 views
4

Мне нужно подтвердить Японская дата, введенная пользователем.Japanese Date Validation - Сравнение

Позвольте сказать, что пользователь выбирает ERA -> Введите DOB как YY - MM - dd.

На стороне сервера я получаю input date и ERA, выбранные пользователем.

Теперь мне нужно проверить введенную дату с выбранной 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()); 
    } 

выход

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

предположим, что пользователь вводит, выбран ЭРА 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

ответ

1

Прежде всех:

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> 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)); 
    } 
} 

печатает

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