프로그래밍 언어/JAVA

ISO 8601 호환 문자열을 java.util.Date로 변환

Rateye 2021. 6. 30. 10:35
728x90
반응형

질문 : ISO 8601 호환 문자열을 java.util.Date로 변환

ISO 8601 형식의 문자열을 java.util.Date 로 변환하려고합니다.

로케일 (샘플 비교)과 함께 사용하는 경우 yyyy-MM-dd'T'HH:mm:ssZ 패턴이 ISO8601 규격임을 발견했습니다.

java.text.SimpleDateFormat 사용하면 올바른 형식의 문자열 2010-01-01T12:00:00+01:00 변환 할 수 없습니다. 콜론없이 2010-01-01T12:00:00+0100 으로 변환해야합니다.

따라서 현재 솔루션은

SimpleDateFormat ISO8601DATEFORMAT = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ", Locale.GERMANY);
String date = "2010-01-01T12:00:00+01:00".replaceAll("\\+0([0-9]){1}\\:00", "+0$100");
System.out.println(ISO8601DATEFORMAT.parse(date));

분명히 그다지 좋지 않습니다. 내가 뭔가를 놓치고 있거나 더 나은 해결책이 있습니까?

대답

JuanZe의 의견 덕분에 저는 Joda-Time 마법을 발견했으며 여기에 설명되어 있습니다 .

그래서 해결책은

DateTimeFormatter parser2 = ISODateTimeFormat.dateTimeNoMillis();
String jtdate = "2010-01-01T12:00:00+01:00";
System.out.println(parser2.parseDateTime(jtdate));

또는 더 간단하게 생성자를 통해 기본 파서를 사용합니다.

DateTime dt = new DateTime( "2010-01-01T12:00:00+01:00" ) ;

나에게 이것은 좋다.

답변

안타깝게도 SimpleDateFormat (Java 6 이하)에서 사용할 수있는 시간대 형식 은 ISO 8601과 호환되지 않습니다. SimpleDateFormat은 RFC # 822 에 따라 "GMT + 01 : 00"또는 "+0100"과 같은 시간대 문자열을 이해합니다.

Java 7이 ISO 8601에 따라 시간대 설명자에 대한 지원을 추가하더라도 SimpleDateFormat은 선택적 부분을 지원하지 않기 때문에 전체 날짜 문자열을 제대로 구문 분석 할 수 없습니다.

regexp를 사용하여 입력 문자열을 다시 형식화하는 것은 확실히 한 가지 가능성이지만 대체 규칙은 질문 에서처럼 간단하지 않습니다.

  • 일부 시간대는 UTC를 제외한 전체 시간이 아니므로 문자열이 반드시 ": 00"으로 끝나는 것은 아닙니다.
  • ISO8601은 시간대에 포함되는 시간 만 허용하므로 "+01"은 "+01 : 00"과 같습니다.
  • ISO8601에서는 "+00 : 00"대신 UTC를 나타 내기 위해 "Z"를 사용할 수 있습니다.

더 쉬운 해결책은 JAXB에서 데이터 유형 변환기를 사용하는 것입니다. JAXB는 XML 스키마 사양에 따라 ISO8601 날짜 문자열을 구문 분석 할 수 있어야하기 때문입니다. javax.xml.bind.DatatypeConverter.parseDateTime("2010-01-01T12:00:00Z")Calendar Date 객체가 필요한 경우 간단히 getTime ()을 사용할 수 있습니다.

Joda-Time 도 사용할 수 있지만 왜 그렇게 귀찮게해야하는지 모르겠습니다.

출처 : https://stackoverflow.com/questions/2201925/converting-iso-8601-compliant-string-to-java-util-date
728x90
반응형