그래서 SimpleDateFormat 및 Date를 사용하여 일부 기존 코드를 대체하려고 할 때 java.time.DateTimeFormatter 및 LocalDate를 사용할 때 문제가 발생했습니다. 두 가지 날짜 형식은 동일하지 않습니다. 이 시점에서 나는 두 날짜 유형이 동일하지 않다는 것을 말해야 만하지만, 나는 시나리오에 대해 결코 신경 쓰지 않는다는 것을 의미하므로 무시할 수있다. 같은 패턴이 DateTimeFormatter 당신이 SDF 동등한 날짜를보고 기대 널 (null)을 생산 끝 모두 포맷터에서 사용하는 경우 당신이 볼 수 있듯이SimpleDateFormat을 DateTimeFormatter로 변환
public Date getDate(String value) {
SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
try {
return dateFormat.parse(value);
} catch (ParseException e) {
return null;
}
}
public LocalDate getLocalDate(String value) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy");
try {
return LocalDate.parse(value, formatter);
} catch (DateTimeParseException e) {
return null;
}
}
public void testDates() {
getDate("03/07/2016"); // Sun Jul 03 00:00:00 BST 2016
getDate("3/7/2016"); // Sun Jul 03 00:00:00 BST 2016
getDate("3/7/2016 00:00:00"); // Sun Jul 03 00:00:00 BST 2016
getDate("3/7/2016 00:00:00.0+0100"); // Sun Jul 03 00:00:00 BST 2016
getDate("3/7/2016T00:00:00.0+0100"); // Sun Jul 03 00:00:00 BST 2016
getLocalDate("03/07/2016"); // 2016-07-03
getLocalDate("3/7/2016"); // null
getLocalDate("3/7/2016 00:00:00"); // null
getLocalDate("3/7/2016 00:00:00.0+0100"); // null
getLocalDate("3/7/2016T00:00:00.0+0100"); // null
}
. 이 시나리오에서는 필자는 불필요한 데이터는 삭제 될 것으로 예상하지만 그렇지 않습니다.
그럼 어떻게 강력한 날짜/시간 구문 분석기를 만들 수 있습니까?!
나는 생각하지 않는다'DD가/MM은/yyyy'이 달의 하루 명확하게 2 자리, 월 2 자리, 올해 4 자리 숫자를 필요로'때문에 SimpleDateFormat'이, 더 강력한 것입니다. 입력 내용이이 요구 사항과 일치하지 않으면 프레임 워크에서 구문 분석 예외를 발생시켜야합니다. 사용자 요구 사항과 다른 변환을하는 것은 위험합니다. –
예 SDF가 손상되었지만 코드가 이에 의존합니다. 따라서 일반적으로 API는 고정 된 형식이어야하며이 시나리오에서는 파일을 파싱하고 사람들은 다양한 형식으로 날짜를 제공 할 수 있다는 점에 동의합니다. 코드는 그들 모두를 수용해야합니다. 분명히 이것은 직면 한 문제의 발췌 일뿐입니다. 실제로 날짜 순서 지정과 구분 기호에 대한 검사가 훨씬 더 많습니다. – Remlap21