2015-07-11 2 views
-2

Пользователь вводит дату следующим образом:Как проверить дату в формате США в Java

20/05/2015

Теперь мы знаем, что в США формат эта дата является недействительным. Как я могу проверить это в java? В моем коде я получаю значение даты с листа excel, и в настоящее время я так обрабатываю его. Дата, считанная с листа excel, является числовой. Например, 3124,0, т.е. нет. дней, прошедших с 1 января 1990 года. Я преобразовав его в формат ММ/ДД/YYY:

SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/YYYY"); 
String s = sdf.format(cell.getDateCellValue()); 

метод формат SimpleDateFormat принимает дату в качестве параметра. поэтому cell.getDateCellValue() задает значение типа даты, которое передается методу format, который преобразует его в строковое значение.

SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/YYYY"); 
String s = sdf.format(cell.getDateCellValue()); 
System.out.println(s); 
sdf.setLenient(false); 
Date d= sdf.parse(s); 
System.out.println(sdf.format(d)); 

так что теперь, если значение первенствует клетка 12/08/2015

System.out.println(s); // prints 12/08/2015 

System.out.println(sdf.format(d)); //Prints 12/28/2015 

не понимают.

+0

Является ли дата, хранящаяся в Excel в виде строки или в качестве даты? И если это дата, возможно ли, по-видимому, автоматическая замена правил форматирования на ячейке для Worldwide, а не для форматирования в США? – Gagravarr

+2

Если пользователь вводит дату, такую ​​как '1/1/1', она может быть в любом из шести форматов. Как программное обеспечение должно проверять, что находится в сознании пользователей? Чтобы программное обеспечение могло надежно определять формат даты, вам необходимо ограничить ввод пользователя. –

+0

Значение даты от excel относится к дате из-за этого кода: 'cell.getDateCellValue());' – coder

ответ

1

Если дата приходит как строки вы можете попробовать это регулярное выражение:

String date ="20/11/2015"; 

    private static final String DATE_PATTERN = 
     "(0?[1-9]|1[012])/(0?[1-9]|[12][0-9]|3[01])/((19|20)\\d\\d)"; 

    pattern = Pattern.compile(DATE_PATTERN); 
    matcher = pattern.matcher(date); 
    if(matcher.matches()){ 
     System.out.println("mateched"); 
    }else { 
     System.out.println("not matched"); 
    } 

Если вы должны сделать это несколько раз, сделать pattern статические и скомпилировать его один раз (в конструкторе или статический блок вероятно).

0

После простейшего формата даты подтвердите его, используя приведенный ниже фрагмент кода. Пожалуйста, поиграйте с регулярным выражением, если вам нужны и другие форматы дат.

SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/YYYY"); 
    s = sdf.format(cell.getDateCellValue()); 

    Pattern datePattern = Pattern 
      .compile("^(0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])[- /.](19|20)\\d\\d$"); 
    Matcher matcher = datePattern.matcher(s); 

    LOG.info("Valid Date:" + matcher.find()); 
+0

это хорошо. но если мне нужно напечатать неверную дату. Например. System.out.println ("Неверная дата:" +); то что это за метод? – coder

+0

Почему этот ниже код не печатает недействительную дату, даже если имеется 3 инкрустированных даты: \t 'SimpleDateFormat sdf = new SimpleDateFormat (« MM/dd/YYYY »); s = sdf.format (cell.getDateCellValue()); Pattern datePattern = Pattern.compile ("^ (0 [1-9] | 1 [012]) [- /.] (0 [1-9] | [12] [0-9] | 3 [01]) [ - /.](19|20)\\d\\d$ "); \t \t \t \t \t \t Matcher matcher = datePattern.matcher (s); \t \t \t \t \t \t, если (Matcher.find()) {\t \t \t \t \t \t System.out.println («Действительная дата:»); \t \t \t \t \t \t} \t \t \t \t \t \t еще { \t \t \t \t \t \t \t System.out.println ("invalidd дата"); \t \t \t \t \t \t} ' – coder

+0

Matcher.find() возвращает истину, если он находит подстроку в вашей переменной даты, которая соответствует регулярному выражению. Вы можете использовать matcher.matches(), если хотите, чтобы переменная точно соответствовала вашему регулярному выражению. –

Смежные вопросы