2017-10-28 14 views
-2

나는 거의 6 시간 동안 이걸 가지고 놀았고 다른 질문을 보았지만 나에게 내가이 이상한 결과를주는 것을 잘못하고있는 걸 알아낼 수 없다. 출력DateFormat.parse() 잘못된 결과를 내기

date string is 2017/12/30 
Date is Mon Jan 30 00:12:00 CST 2017 

된 날 누군가가 이런 일이 내 이유를 말해 줄 수 년 12 월 30 일하지 1월 30해야

String dateStr = "20171230"; 
    StringBuilder sb = new StringBuilder(); 
    sb.append(dateStr.subSequence(0, 4)) 
     .append("/") 
     .append(dateStr.substring(4,6)) 
     .append("/") 
     .append(dateStr.substring(6,8)); 

    dateStr = sb.toString(); 

    System.out.println("date string is " + dateStr); 

    DateFormat df = new SimpleDateFormat("yyyy/mm/dd"); 

    df.setLenient(false); 

    Date Date = null; 

    try { 
     Date = df.parse(dateStr); 
    } catch (ParseException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    System.out.println("Date is " + Date); 

아래 여기 내 코드입니다.

답변

2

간단한 날짜 형식을 전달한 형식에는 월이 있다고 생각되는 위치가 정의되어 있습니다.

시간 출력이 너무 00:12로 설정되어 있는지 확인하십시오.

는 대신, YYYY를 사용/MM/DD

1

내가 당신에 대해 물어 정확히 이상으로 조금 이동 몇 가지 제안을 줄 수 있도록합니다. 내 제안이 도움이되어야한다고 생각합니다.

먼저 긴 오래된 클래스 인 DateSimpleDateFormat을 고수하고 싶지는 않습니다. The modern Java date and time API은 일반적으로 작업하기에 훨씬 좋으며 불쾌한 놀라움이 적습니다. JSR-310 또는 java.time으로 알려져 있습니다.

두 번째로, 날짜를 추출하기 전에 StringBuilder을 사용하여 문자열을 다시 포맷 할 필요가 없습니다. 20171230은 날짜로 직접 파싱 될 수 있습니다. 더 나쁜 것은 문자열을 변환하는 방법으로 길이를 검증하지 않는다는 것입니다. 8 자리가 아닌 9 자리가 나오면이를 잡아서 예외를 던지기를 원하지만 코드는 처음 8 자리를 취합니다. 더있는 경우 무시합니다.

마지막으로 Trenton Trama는 이미 the other answer을 지적 했으므로 형식 패턴 문자열은 대소 문자를 구분합니다. 대문자 또는 소문자 사용 여부와 위치는 중요합니다. 잘못된 대/소문자를 사용하면 잘못된 결과가 발생할 가능성이 높습니다. 이것은 오래된 API와 현대 API 모두에 적용됩니다. 다행스럽게도, 파싱에 관해서는, 현대 API는 잘못된 케이스를 사용할 때 예외를 던지려는 경향이 있으므로 적어도 뭔가 잘못되었다는 사실을 알게됩니다.

마침내, 다른 사람이 다른 stackoverflowers처럼 코드를 읽으려면 코드 규칙을 사용하여 도움을 받으십시오. 변수 이름은 소문자로 시작합니다. Date이라는 클래스와 Date이라는 변수가있을 때 특히 혼란 스럽습니다. 최대

위 금액 :

DateTimeFormatter dtf = DateTimeFormatter.ofPattern("uuuuMMdd"); 
    String dateStr = "20171230"; 
    LocalDate date = LocalDate.parse(dateStr, dtf); 
    System.out.println("Date is " + date); 

출력은 다음과 같습니다

Date is 2017-12-30 

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

최소한 Java 을 사용하는 경우 가능합니다.

  • Java 8 이상에서는 새로운 API가 내장되어 있습니다.
  • Java 6 및 7에서는 the ThreeTen Backport을 얻습니다. 새 클래스의 백 포트 (최신 API가 처음 정의 된 JSR 310에 대한 ThreeTen입니다).
  • Android의 경우 ThreeTen Backport의 Android 버전을 사용하십시오. ThreeTenABP라고 불리우며, this question: How to use ThreeTenABP in Android Project에 훌륭한 설명이 있다고 생각합니다.