ProgramingTip

자바 : 현재 필요한 날짜 형식이 필요한 형식에 맞는지 확인하십시오.

bestdevel 2021. 1. 9. 16:27
반응형

자바 : 현재 필요한 날짜 형식이 필요한 형식에 맞는지 확인하십시오.


이 질문에 이미 답변이 있습니다.

Java 에서이 작업을 수행 할 수 있는 방법이 있는지 알고 싶었습니다. 개체는 Regex 솔루션을 사용할 수 있습니다.

모든 문자가 사용자의 입력이 있습니다. 필요한 날짜 형식에 맞는지 확인하고 싶습니다.

20130925를 입력 입력 하고 필요한 형식은 DD / MM / YYYY 이므로이 경우에는 허위를 받아야합니다 .

이 날짜를 변환하고 싶지 않고 입력하고 필요한 날짜 형식에 맞는지 확인하고 싶습니다.



나는 다음을 시도했다

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 ();에 의해 생성 된 예외를 사용할 수 없습니다.


부인 성명

알 수없는 형식의 날짜 / 시간 값으로 문자열을 다시 구문 분석 하는 것은 본질적으로 불가능합니다 ( 3/3/3실제로 무엇을 의미합니까?!). 우리가 할 수있는 것은 "최선의 노력"입니다.

하지만

이 솔루션은 은을 던지지 않고를Exception반환합니다 boolean. 이것은 의도적으로는 것입니다. 모든 Exception의는 가드 혈통으로 순수하게 사용됩니다.

2018 년

이제 2018 년이 일정 Java 8+는 날짜 / 시간 API가 있고 나머지는 ThreeTen 백 포트가 있습니다. 솔루션은 기본적으로 동일하지만 다음 사항에 대한 검사를 수행해야 약간 더 복잡해집니다.

  • 날짜와 시간
  • 날짜 만
  • 시간 만

이렇게하면 다음과 같이위원회.

public static boolean isValidFormat(String format, String value, Locale locale) {
    LocalDateTime ldt = null;
    DateTimeFormatter fomatter = DateTimeFormatter.ofPattern(format, locale);

    try {
        ldt = LocalDateTime.parse(value, fomatter);
        String result = ldt.format(fomatter);
        return result.equals(value);
    } catch (DateTimeParseException e) {
        try {
            LocalDate ld = LocalDate.parse(value, fomatter);
            String result = ld.format(fomatter);
            return result.equals(value);
        } catch (DateTimeParseException exp) {
            try {
                LocalTime lt = LocalTime.parse(value, fomatter);
                String result = lt.format(fomatter);
                return result.equals(value);
            } catch (DateTimeParseException e2) {
                // Debugging purposes
                //e2.printStackTrace();
            }
        }
    }

    return false;
}

이것은 다음을 싸다 ...

System.out.println("isValid - dd/MM/yyyy with 20130925 = " + isValidFormat("dd/MM/yyyy", "20130925", Locale.ENGLISH));
System.out.println("isValid - dd/MM/yyyy with 25/09/2013 = " + isValidFormat("dd/MM/yyyy", "25/09/2013", Locale.ENGLISH));
System.out.println("isValid - dd/MM/yyyy with 25/09/2013 12:13:50 = " + isValidFormat("dd/MM/yyyy", "25/09/2013  12:13:50", Locale.ENGLISH));
System.out.println("isValid - yyyy-MM-dd with 2017-18--15 = " + isValidFormat("yyyy-MM-dd", "2017-18--15", Locale.ENGLISH));

많이 ...

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
isValid - yyyy-MM-dd with 2017-18--15 = false

원래 답변

간단한 시도 및 다음과 같은 것을 사용

String하여 필요한 구문 분석DateSimpleDateFormat

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합니다.

제안으로 ...

실행 예제로 업데이트 됨

뭘하고 있는지 잘 모르겠지만 다음 예는 ...

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

나에게 예상대로 작동하는 것입니다.


귀하의 경우 정규식을 사용할 수 있습니다.

boolean checkFormat;

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

더 넓은 범위를 원하거나 유연한 솔루션을 MadProgrammer의 답변을 참조하십시오 .

편집하다

이 답변을 게시 한 지 거의 5 년이 지난 지금, 이것이 날짜 형식을 검증하는 어리석은 방법이라는 것을 깨달았습니다. 하지만 여기서는 정규식을 사용하여 날짜를 확인하는 것은 허용되지 않는다고 사람들에게 알리기 위해 여기에 남겨 둘 것입니다.


간단한 날짜 형식 평가에 이것을 시도 할 수 있습니다.

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

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

정규식과 SimpleDateFormat의 조합이 내가 믿는 정답입니다. SimpleDateFormat은 개별 구성 요소가 유효하지 않은 경우 예외를 포착하지 않습니다. 정의 된 형식 : yyyy-mm-dd 입력 : 201-0-12 예외가 발생하지 않습니다.이 경우는 처리되어야합니다. 그러나 Sok Pomaranczowy와 Baby가 제안한 정규식을 사용하면이 특정 경우를 처리합니다.


다음은 간단한 방법입니다.

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

예를 들어 날짜 형식을 "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();
                }

정규식을 사용하여 유효성 검사에 대한 자세한 정보를 사용할 수 있습니다. 예를 들어이 코드는 (1950-2050) 사이의 적절한 날짜 및 월 값과 연도를 사용하여 (DD / MM / yyyy) 형식의 모든 날짜를 유효성 검사하는 데 사용할 수 있습니다.

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

참조 URL : https://stackoverflow.com/questions/20231539/java-check-the-date-format-of-current-string-is-according-to-required-format- 또는

반응형