Подтвердить что ты не робот

Java: проверьте формат даты текущей строки в соответствии с требуемым форматом или нет.

Я хотел знать, что есть способ, доступный в Java, который может это сделать. В противном случае я могу пойти на решение Regex.

У меня есть строка ввода от пользователя, которая может быть любыми символами. И я хочу проверить, что строка ввода соответствует моему формату даты или нет.

Поскольку у меня есть вход 20130925, и мой требуемый формат dd/MM/yyyy, поэтому для этого случая я должен получить false.

Я не хочу конвертировать эту дату, я просто хочу проверить, соответствует ли строка ввода в соответствии с требуемым форматом даты или нет.



Я пробовал следовать

Date date = null;
try {
date = new SimpleDateFormat("dd/MM/yyyy").parse("20130925");
} catch (Exception ex) {
// do something for invalid dateformat
}

но блок catch (Exception ex) не может поймать исключения, сгенерированные SimpleDateFormat.Parse();

4b9b3361

Ответ 1

Простая попытка и разобрать String на требуемый Date, используя что-то вроде SimpleDateFormat

Date date = null;
try {
    SimpleDateFormat sdf = new SimpleDateFormat(format);
    date = sdf.parse(value);
    if (!value.equals(sdf.format(date))) {
        date = null;
    }
} catch (ParseException ex) {
    ex.printStackTrace();
}
if (date == null) {
    // Invalid date format
} else {
    // Valid date format
}

Затем вы можете просто написать простой метод, который выполнил это действие, и возвратил true, когда Date не был null...

Как предложение...

Обновлен с запущенным примером

Я не уверен, что вы делаете, но, следующий пример...

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class TestDateParser {

    public static void main(String[] args) {
        System.out.println("isValid - dd/MM/yyyy with 20130925 = " + isValidFormat("dd/MM/yyyy", "20130925"));
        System.out.println("isValid - dd/MM/yyyy with 25/09/2013 = " + isValidFormat("dd/MM/yyyy", "25/09/2013"));
        System.out.println("isValid - dd/MM/yyyy with 25/09/2013 12:13:50 = " + isValidFormat("dd/MM/yyyy", "25/09/2013  12:13:50"));
    }

    public static boolean isValidFormat(String format, String value) {
        Date date = null;
        try {
            SimpleDateFormat sdf = new SimpleDateFormat(format);
            date = sdf.parse(value);
            if (!value.equals(sdf.format(date))) {
                date = null;
            }
        } catch (ParseException ex) {
            ex.printStackTrace();
        }
        return date != null;
    }

}

Выходы (что-то типа)...

java.text.ParseException: Unparseable date: "20130925"
isValid - dd/MM/yyyy with 20130925 = false
isValid - dd/MM/yyyy with 25/09/2013 = true
isValid - dd/MM/yyyy with 25/09/2013 12:13:50 = false
    at java.text.DateFormat.parse(DateFormat.java:366)
    at javaapplication373.JavaApplication373.isValidFormat(JavaApplication373.java:28)
    at javaapplication373.JavaApplication373.main(JavaApplication373.java:19)

Неправильно. Для isValidFormat ( "yyyy-MM-dd", "2017-18-15" ); не выбрасывать исключение.

isValid - yyyy-MM-dd", "2017-18--15 = false

Кажется, что работает для меня - метод не полагается (и не бросает) только исключение для выполнения операции

Ответ 2

В вашем случае вы можете использовать регулярное выражение:

boolean checkFormat;

if (input.matches("([0-9]{2})/([0-9]{2})/([0-9]{4})"))
    checkFormat=true;
else
   checkFormat=false;

Для большей области действия или если вы хотите получить гибкое решение, обратитесь к ответу от MadProgrammer.

Ответ 3

Вы можете попробовать это для простого формата даты valdation

 public Date validateDateFormat(String dateToValdate) {

    SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy HHmmss");
    //To make strict date format validation
    formatter.setLenient(false);
    Date parsedDate = null;
    try {
        parsedDate = formatter.parse(dateToValdate);
        System.out.println("++validated DATE TIME ++"+formatter.format(parsedDate));

    } catch (ParseException e) {
        //Handle exception
    }
    return parsedDate;
}

Ответ 4

DateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
formatter.setLenient(false);
try {
    Date date= formatter.parse("02/03/2010");
} catch (ParseException e) {
    //If input date is in different format or invalid.
}

formatter.setLenient(false) будет обеспечивать строгое соответствие.

Если вы используете Joda-Time -

private boolean isValidDate(String dateOfBirth) {
        boolean valid = true;
        try {
            DateTimeFormatter formatter = DateTimeFormat.forPattern("dd/MM/yyyy");
            DateTime dob = formatter.parseDateTime(dateOfBirth);
        } catch (Exception e) {
            valid = false;
        }
        return valid;
    }

Ответ 5

Комбинация регулярного выражения и SimpleDateFormat - правильный ответ, на который я верю. SimpleDateFormat не вызывает исключения, если отдельные компоненты являются недопустимыми, Формат: yyyy-mm-dd вход: 201-0-12 Никакое исключение не будет выбрано. В этом случае необходимо было обработать. Но с регулярным выражением, предложенным Соком Помаранцовым и Ребенком, он позаботится об этом конкретном случае.

Ответ 6

Вот простой способ:

public static boolean checkDatePattern(String padrao, String data) {
    try {
        SimpleDateFormat format = new SimpleDateFormat(padrao, LocaleUtils.DEFAULT_LOCALE);
        format.parse(data);
        return true;
    } catch (ParseException e) {
        return false;
    }
}

Ответ 7

Например, если вы хотите, чтобы формат даты был "03.11.2017"

 if (String.valueOf(DateEdit.getText()).matches("([1-9]{1}|[0]{1}[1-9]{1}|[1]{1}[0-9]{1}|[2]{1}[0-9]{1}|[3]{1}[0-1]{1})" +
           "([.]{1})" +
           "([0]{1}[1-9]{1}|[1]{1}[0-2]{1}|[1-9]{1})" +
           "([.]{1})" +
           "([20]{2}[0-9]{2})"))
           checkFormat=true;
 else
           checkFormat=false;

 if (!checkFormat) {
 Toast.makeText(getApplicationContext(), "incorrect date format! Ex.23.06.2016", Toast.LENGTH_SHORT).show();
                }

Ответ 8

Для этого можно использовать Regex с некоторой подробной информацией для проверки, например, этот код может использоваться для подтверждения любой даты в формате (DD/MM/yyyy) с правильной датой и месячным значением и годом между (1950-2050)

    public Boolean checkDateformat(String dateToCheck){   
        String rex="([0]{1}[1-9]{1}|[1-2]{1}[0-9]{1}|[3]{1}[0-1]{1})+
        \/([0]{1}[1-9]{1}|[1]{1}[0-2]{2})+
        \/([1]{1}[9]{1}[5-9]{1}[0-9]{1}|[2]{1}[0]{1}([0-4]{1}+
        [0-9]{1}|[5]{1}[0]{1}))";

        return(dateToCheck.matches(rex));
    }

Ответ 9

Так как я не могу комментировать, я добавлю к @Jonjongot ответ, что вы можете просто

return input.matches("([0-9]{2})/([0-9]{2})/([0-9]{4})")