자바 : 현재 필요한 날짜 형식이 필요한 형식에 맞는지 확인하십시오.
이 질문에 이미 답변이 있습니다.
- Java 21 답변 에서 날짜를 온전하게 확인하는 방법
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
하여 필요한 구문 분석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
합니다.
제안으로 ...
실행 예제로 업데이트 됨
뭘하고 있는지 잘 모르겠지만 다음 예는 ...
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));
}
'ProgramingTip' 카테고리의 다른 글
LINQ select 문에서 Lambda를 사용하는 방법 (0) | 2021.01.09 |
---|---|
WebDeploy- 사용자 '. \ WDeployConfigWriter '에 거의 할 수 없습니다. (0) | 2021.01.09 |
누락 된 값이있는 경우 pandas 데이터 프레임 열을 소문자로 지정하는 방법은 무엇입니까? (0) | 2021.01.09 |
프로그래밍 방식으로 Android 애플리케이션의 캐시 지우기 (0) | 2021.01.09 |
a 전에 모든 것을 얻는 방법 : in a string Python (0) | 2021.01.09 |