복붙노트

[SCALA] 왜 SimpleDateFormat의 잘못된 날짜를 구문 분석 하는가?

SCALA

왜 SimpleDateFormat의 잘못된 날짜를 구문 분석 하는가?

나는 문자열 형식으로 날짜를하고 난 날짜 폴더의 유틸리티로 그 구문 분석합니다.

var date ="03/11/2013"

나는이 같이 분석하고있다 :

new SimpleDateFormat("MM/dd/yyyy").parse(date)

그러나 이상한 것은 그이다, 나는 "03-08-201309 hjhkjhk"또는 "03-88-2013"또는 43-88-201378 "을 통과하고있는 경우,이 오류가 발생하지 않습니다, 그것을 구문 분석합니다.

이를 위해 지금은 날짜의 입력이 올바른지 여부를 확인하기위한 정규식 패턴을 작성해야합니다. 하지만 왜 이렇게입니까 ??

코드 :

scala> val date="03/88/201309 hjhkjhk"
date: java.lang.String = 03/88/201309 hjhkjhk

scala> new SimpleDateFormat("MM/dd/yyyy").parse(date)
res5: java.util.Date = Mon May 27 00:00:00 IST 201309

해결법

  1. ==============================

    1.당신은 DateFormat.setLenient (거짓)를 사용한다 :

    당신은 DateFormat.setLenient (거짓)를 사용한다 :

    SimpleDateFormat df = new SimpleDateFormat("MM/dd/yyyy");
    df.setLenient(false);
    df.parse("03/88/2013"); // Throws an exception
    

    나는 당신이 예상하는 것보다 더 관대에도 setLenient (false)를 가진 것을 기억하는 것 - - 나는 확실히 그건 당신이 원하는 모든 것을 잡을 것 아니에요하지만 예를 들어 무효 월 번호를 잡을 것이다.

    나는, 예를 들어, 후행 텍스트를 잡을 것입니다 생각하지 않는다 "2013년 3월 1일 sjsjsj". 구문 분석이 완료된 후에는 잠재적으로 ParsePosition의를 받아들이는 구문 분석의 오버로드를 사용할 수 있습니다, 현재 구문 분석 인덱스를 확인 :

    ParsePosition position = new ParsePosition(0);
    Date date = dateFormat.parse(text, position);
    if (position.getIndex() != text.length()) {
        // Throw an exception or whatever else you want to do
    }
    

    그리고 일반적으로 청소기 날짜 / 시간 API 어쨌든입니다 - 당신은 또한 잘 엄격한 해석을 허용 할 수있다 Joda 시간 API 봐야한다.

  2. ==============================

    2.존 소총의 대답은 정확하고 그것이 2013 년에 쓰여진 좋은 대답했다.

    존 소총의 대답은 정확하고 그것이 2013 년에 쓰여진 좋은 대답했다.

    그러나 귀하의 질문에, SimpleDateFormat의 및 날짜에 사용하는 클래스가, 지금은 긴 구식이되어, 누군가가 그들 오늘과 비슷한 문제를 가지고 그렇다면, 이럴 최선의 답은 현대적인 자바 날짜 및 시간 API를 사용하여 변화하는 것입니다.

    난 당신이 자바와 함께 살 것이다, 그래서 미안 해요, 스칼라 코드를 작성할 수 없습니다입니다. 내가 사용하고

    private static DateTimeFormatter parseFormatter
            = DateTimeFormatter.ofPattern("MM/dd/yyyy");
    

    의미는 약간 차이가 있지만 형식 패턴 문자, 당신의 문제와 동일합니다. 우리가 살펴 보 겠지만 DateTimeFormatter는 그대로 패턴 문자의 수를합니다. 이제 우리는 시도 :

            System.out.println(LocalDate.parse(date, parseFormatter));
    

    결과 :

    존 소총은 오래된 SimpleDateFormat의 엄밀 또는 비 관대 될 수 있음을 설명했다. 이것은, '관대'라는 사실은 3 대신 2의 해결 스타일을 가지고, 너무 DateTimeFormatter 마찬가지입니다 '스마트'와 '엄격한'. 많은 프로그래머가이 인식하지 때문에,하지만, 나는 그들이 '관대 한'기본 ( '스마트'를한다) 제작하지 않는 좋은 선택을했다고 생각.

    우리가 우리의 포맷터 관대을하고 싶다면?

    private static DateTimeFormatter parseFormatter
            = DateTimeFormatter.ofPattern("MM/dd/yyyy")
                    .withResolverStyle(ResolverStyle.LENIENT);
    

    지금은 2013년 5월 27일에 "03/88/2013"을 구문 분석합니다. 3 월 초 88 일 계산하는 것은 또 다른 오류 메시지가 여전히 동일 월 27 제공 :이 이전 클래스도했을 것입니다 생각합니다. 즉 여전히 6 자리 연도와 하이픈에, 구문 분석되지 않은 텍스트 객체.

    질문 : 수 있습니까 내 자바 버전으로 현대 API를 사용할 수 있습니까?

    자바 6 이상에서 사용하는 경우, 당신은 할 수 있습니다.

  3. from https://stackoverflow.com/questions/15336200/why-does-simpledateformat-parse-incorrect-date by cc-by-sa and MIT license