질문 : 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
'프로그래밍 언어 > JAVA' 카테고리의 다른 글
JAVA의 날짜 연산에서 이상한 결과가 나오는 이유 (0) | 2021.07.06 |
---|---|
macOS에서 기본 Java (JDK) 버전을 설정하거나 변경하는 방법 (0) | 2021.07.06 |
Java import 문에 와일드 카드를 사용하는 것이 왜 나쁜가요? (0) | 2021.06.26 |
Java에서 일반 유형의 인스턴스를 만드는 방법 (0) | 2021.06.24 |
Java Map의 각 항목을 효율적으로 반복하는 방법 (0) | 2021.06.24 |