2010-01-25 4 views
9

Java에서 사용자 정의 날짜 형식을 사용해야합니다. 자바는 마이크로 초를 지원하지 않지만 마이크로 초를 포함합니다. 그 때문에 시간 패턴을 0으로 채 웁니다.이 패턴은 서식을 지정할 때 잘 작동하지만 그 패턴으로 날짜 문자열을 구문 분석 할 수는 없습니다.사용자 정의 날짜 형식을 구문 분석 할 수 없습니다. (Java)

간단한 해결 방법이 있습니까? 아니면 자체적으로 (String 함수를 사용하여) 마이크로 초를 처리해야합니까?

@Test 
public void testDateFormat() throws ParseException { 
    DateFormat format = new SimpleDateFormat("yyyy-MM-dd-HH.mm.ss.SSS000"); 
    String theDate = format.format(new Date()); 
    // this will fail: 
    format.parse(theDate); 
} 

java.text.ParseException : 파싱 할 일 "2010-01-25-12.40.35.769000"

+0

FYI, [java.util.Date'] (https://docs.oracle.com/javase/8/docs/api/java/util/Date.html)와 같은 번거로운 이전 날짜 시간 클래스 , ['java.util.Calendar'] (https://docs.oracle.com/javase/8/docs/api/java/util/Calendar.html) 및'java.text.SimpleTextFormat'은 이제 [유산 ] (https://en.wikipedia.org/wiki/Legacy_system)에서 [java.time] (https://docs.oracle.com/javase/8/docs/api/java/time/package- summary.html) 클래스를 참조하십시오. [Tutorial by Oracle] (https://docs.oracle.com/javase/tutorial/datetime/TOC.html)을 참조하십시오. –

답변

11

SimpleDateFormat에서 사용되는 패턴은 불행히도 구문 분석기로 사용되는지 포맷터로 사용되는지에 따라 다른 의미가 있습니다. 로

2010-01-25-14.17.47.307000

을 사용 : 포맷터으로, 당신의 패턴이 예상된다 무엇을, 출력은 세 0 문자 다음에 세 자리수로 밀리 초 값, 예를 들면로 끝납니다 않습니다 그러나 파서 인 "SSS"패턴은 임의의 자릿수와 일치하며 위의 예를 307000ms로 구문 분석합니다. ms 필드를 파싱 한 후에 파서는 여전히 "000"하위 문자열을 찾고 패턴의 요구 사항을 충족시키지 않으면 서 입력 문자열의 끝에 도달했기 때문에 예외로 실패합니다.

SimpleDateFormat에 μs 값의 패턴이 없으므로 SimpleDateFormat에 입력하기 전에 마지막 세 개의 0 문자에 대한 입력 문자열을 제거하기 위해 자체 래퍼를 작성해야합니다.

0

지금처럼 제로 주위에 ''을 추가 "yyyy-MM-dd-HH.mm.ss.SSS'000'"

날짜 및 시간 형식은 날짜 및 시간 패턴 문자열로 지정됩니다. 날짜/시간 패턴 문자열 'A'에서 'Z'까지의 인용 부호없는 문자와 'a'에서 'z'까지의 은 패턴 문자로 해석되어 날짜 또는 시간 문자열의 구성 요소를 나타냅니다. 텍스트는 해석을 피하기 위해 작은 따옴표 (')을 사용하여 인용 할 수 있습니다. " ''" 은 작은 따옴표를 나타냅니다. 다른 모든 문자는 해석되지 않습니다. 형식을 지정하는 동안 출력이 문자열로 복사되거나 구문 분석 중에 과 입력 문자열이 일치합니다.

+5

작은 따옴표가있는 테스트 케이스에서 여전히 ParseException이 발생합니다. –

+1

'000'은 (는) 'A'에서 'Z'로, 'a'에서 'z'까지의 문자가 아닙니다. – Marboni

3

당신이 마이크로 필요하면 jarnbjo의 대답 이외에, 당신은을 java.sql.Timestamp 사용할 수 있습니다

Date dateToMillis = format.parse(theDate.substring(0, 23)); 
DateFormat timestampFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); 
Timestamp timestamp = Timestamp.valueOf(timestampFormat.format(dateToMillis) + theDate.substring(23,26)); 
1

TL; DR

LocalDateTime.parse( 
    "2010-01-25-12.40.35.769000" , 
    DateTimeFormatter.ofPattern("uuuu-MM-dd-HH.mm.ss.SSSSSS") 
) 

java.time

사용

현재 레거시 상태 인 귀찮은 이전 날짜 시간 클래스를 사용하고 있으며 java.time 클래스를 대신합니다.

이 오래된 클래스는 자릿수 세 자리로 milliseconds으로 추적됩니다. 현대 자바.시간 클래스는 nanoseconds, 9 소수점 이하 자릿수는입니다.

DateTimeFormatter f = DateTimeFormatter.ofPattern("uuuu-MM-dd-HH.mm.ss.SSSSSS") ; 
LocalDateTime ldt = LocalDateTime.parse("2010-01-25-12.40.35.769000"); 

ldt.toString() : 2010-01-25T12 : 40 : 35.769

ISO 8601

팁 : 텍스트로 날짜 -을 표현하기 위해 자신의 형식을 발명하기보다는 시간 값은 표준 ISO 8601 형식을 고수하십시오.

java.time 클래스는 기본적으로 표준 형식을 사용합니다. 위의 출력에서 ​​해당 형식을 볼 수 있습니다. T은 날짜 부분과 시간 부분을 구분합니다. java.time

소개


java.time 프레임 워크는 나중에 자바 8에 내장되어 있습니다. 이 클래스는 java.util.Date, Calendar, & SimpleDateFormat과 같이 문제가있는 이전 legacy 날짜 - 시간 클래스를 대체합니다.

maintenance mode에있는 Joda-Time 프로젝트는 java.time 클래스로의 마이그레이션을 권장합니다.

자세히 알아 보려면 Oracle Tutorial을 참조하십시오. 그리고 많은 예제와 설명을 위해 스택 오버플로를 검색하십시오. 사양은 JSR 310입니다.

어디에서 java.time 클래스를 얻을 수 있습니까?

ThreeTen-Extra 프로젝트는 추가 클래스와 java.time를 확장합니다. 이 프로젝트는 향후 java.time에 추가 될 수있는 가능성을 입증합니다.여기에 Interval, YearWeek, YearQuartermore과 같은 유용한 클래스가 있습니다.

관련 문제