2013-04-10 4 views
6

String (YYYY-MM-dd HH:mm)에서 Date까지 구문 분석하려고하지만 예상보다 잘못된 날짜가 표시됩니다.SimpleDateFormat "YYYY-MM-dd HH : mm"구문 분석시 잘못된 날짜 시간 생성

CODE :

Date newDate = null; 
String dateTime = "2013-03-18 08:30"; 
SimpleDateFormat df = new SimpleDateFormat("YYYY-MM-dd HH:mm", Locale.ENGLISH); 
df.setLenient(false); 
try { 
    newDate = df.parse(dateTime); 
} catch (ParseException e) { 
    throw new InvalidInputException("Invalid date input."); 
} 

가 생산 :

일 12월 30일 동부 표준시 08시 30분 0초 2012 (잘못된)

나는 융통성이를 출발 없지만 운했습니다.

업데이트 대답에 대한

감사 Sudhanshu, 그것은 자바 변환을 해결하기 위해 저를 도왔다. 위의 코드에서 반환 된 날짜를 데이터베이스에 입력하면 날짜가 올바르게 표시되지만 시간은 항상 00:00입니다.

ps.setDate(3, new java.sql.Date(app.getDate().getTime())); 
+0

업데이트의 경우 'java.sql.Date'는 날짜 전용이며 SQL의 날짜 데이터 유형을 나타냅니다. 문서에서 : "SQL DATE의 정의에 따라 java.sql.Date 인스턴스로 랩핑 된 밀리 초 값은 특정 표준 시간대에서시, 분, 초 및 밀리 초를 0으로 설정하여 '정규화'해야합니다. 인스턴스가 연결되어 있습니다. " –

답변

32

YYYY는

SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm", Locale.ENGLISH); 

여기
자바 6 SimpleDateFormat에 대한 설명서를 확인하시기 바랍니다 yyyy-해야한다 : http://docs.oracle.com/javase/6/docs/api/java/text/SimpleDateFormat.html
자바 7 : http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html

+0

답변 해 주셔서 감사합니다. 나는 초기 문제를 해결했다. 날짜에 값을 입력하면 날짜가 올바르게 표시되지만 시간은 항상 00:00입니다. ps.setDate (3, 새로운 java.sql.Date (app.getDate(). getTime())); – Sas

6

사용 작은 경우 Y,하지 모자. ieyyy 아니 YYYY

여기에 의견을 확인하십시오 : Java Simple Date Format 및 기타 답변을 참조하십시오.

4

두 가지 문제가 있습니다.

  1. 형식 문자열은 "yyyy-MM-dd HH:mm"이어야합니다.
  2. 시간을 저장할 데이터 유형은 TimeStamp이고 데이터베이스에는 Date이 아닙니다.

두 가지를 모두 수정하면 날짜를 저장하고 검색 할 수 있습니다.

1

여기에 현대적인 대답이 있습니다. 다른 답변은 2013 년에 작성되었을 때 훌륭한 답변이었습니다. 그 후 1 년 후 현대 날짜와 시간 API는 이전 클래스 Date, SimpleDateFormat 및 친구들을 대체했습니다. IMHO 이제 새 수업을 사용해야합니다. 그들은 훨씬 더 프로그래머에게 친숙합니다.

LocalDateTime newDate = null; 
    String dateTime = "2013-03-18 08:30"; 
    DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm", Locale.ENGLISH); 
    try { 
     newDate = LocalDateTime.parse(dateTime, dtf); 
    } catch (DateTimeParseException e) { 
     throw new InvalidInputException("Invalid date input."); 
    } 

클래스 이름을 제외하면 이전 코드와 크게 다르지 않습니다. 다른 예가 있으면 차이가있을 것이며, 일반적으로 현대 수업은 코드를 명확하게하고 오류를 줄이는 기회를 제공합니다.

차이의 한 작은 데모를 들어, 당신이 그것에 대문자 YYYY로했다 형식 패턴 문자열을 해보자 :

DateTimeFormatter dtf = DateTimeFormatter.ofPattern("YYYY-MM-dd HH:mm", Locale.ENGLISH); 

이제 코드는 java.time.format.DateTimeParseException: Text '2013-03-18 08:30' could not be parsed: Unable to obtain LocalDateTime from TemporalAccessor: {MonthOfYear=3, DayOfMonth=18, WeekBasedYear[WeekFields[SUNDAY,1]]=2013},ISO resolved to 08:30 of type java.time.format.Parsed가 발생합니다. 그것은 길다, 나는 알고있다. 주목해야 할 점은 그것이 언급 한 분야 중 일년이 없다는 것입니다. 오직 WeekBasedYear 만 있습니다. 이건 같은게 아니야; 그리고 대문자 인 Y은 주 기준 연도 (주 번호가 usseful 인 경우)이므로 올해 정확하게 소문자 인 y을 사용해야하기 때문일 수도 있습니다. 나는이 행동을 오래된 수업보다 조금 더 도움이된다고 생각합니다. 그들은 잘못된 결과를주었습니다. 모든 것이 위선이라고 생각하고, 어둠에 대해 무엇이 잘못되었는지를 완전히 알려주었습니다.

다음으로 데이터베이스에 날짜 - 시간을 저장하고 싶습니다. 예전에는 적절한 java.sql 유형으로 변환했습니다. 더 이상 필요하지 않습니다. 나는 당신이 할 수있는 JDBC 4.2 드라이버를 믿는다 :

ps.setObject(3, newDate); 

나는 이것을 데이터베이스로 테스트하지 않았다. setDate() 대신 setObject()을 사용합니다.