java.util.Date와 javax.xml.datatype.XMLGregorianCalendar를 양방향으로 변환하는 간단한 방법을 찾고 있습니다.
지금 사용중인 코드는 다음과 같습니다 .
import java.util.GregorianCalendar;
import javax.xml.datatype.DatatypeConfigurationException;
import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.XMLGregorianCalendar;
/**
* Utility class for converting between XMLGregorianCalendar and java.util.Date
*/
public class XMLGregorianCalendarConverter {
/**
* Needed to create XMLGregorianCalendar instances
*/
private static DatatypeFactory df = null;
static {
try {
df = DatatypeFactory.newInstance();
} catch (DatatypeConfigurationException dce) {
throw new IllegalStateException(
"Exception while obtaining DatatypeFactory instance", dce);
}
}
/**
* Converts a java.util.Date into an instance of XMLGregorianCalendar
*
* @param date Instance of java.util.Date or a null reference
* @return XMLGregorianCalendar instance whose value is based upon the
* value in the date parameter. If the date parameter is null then
* this method will simply return null.
*/
public static XMLGregorianCalendar asXMLGregorianCalendar(java.util.Date date) {
if (date == null) {
return null;
} else {
GregorianCalendar gc = new GregorianCalendar();
gc.setTimeInMillis(date.getTime());
return df.newXMLGregorianCalendar(gc);
}
}
/**
* Converts an XMLGregorianCalendar to an instance of java.util.Date
*
* @param xgc Instance of XMLGregorianCalendar or a null reference
* @return java.util.Date instance whose value is based upon the
* value in the xgc parameter. If the xgc parameter is null then
* this method will simply return null.
*/
public static java.util.Date asDate(XMLGregorianCalendar xgc) {
if (xgc == null) {
return null;
} else {
return xgc.toGregorianCalendar().getTime();
}
}
}
내가 간과 한 API 호출처럼 더 간단한 것이 있습니까?
표준 XML 날짜 / 시간과 Java 날짜 객체 사이의 변환은 꽤 일상적인 작업처럼 보이며이 코드를 작성해야한다는 사실에 놀랐습니다.
어떤 제안?
참고 : 내 JAXB 클래스는 스키마에서 자동 생성됩니다. 내 프로젝트의 빌드 프로세스로 인해 생성 된 클래스를 수동으로 변경할 수 없습니다. xs : dateTime 요소는 JAXB 클래스에서 XMLGregorianCalendar로 XJC에 의해 생성됩니다. 스키마는 주기적으로 확장되고 조정되므로 스키마 XSD 파일을 제한적으로 변경할 수 있습니다.
솔루션 업데이트 : Blaise가 제안한 솔루션을 통해 XMLGregorianCalendar를 혼합에서 제외하고 대신 java.util.Calendar 객체를 처리 할 수있었습니다. 내 스키마 파일의 맨 위에 JAXB 바인딩 절을 추가함으로써 XJC는 내 JAXB 클래스에서 xs : dateTime에 대한보다 적절한 매핑을 생성 할 수 있습니다. 다음은 내 XSD 파일의 수정 사항을 보여주는 일부 스 니펫입니다.
XSD 파일의 루트 요소 :
<xs:schema xmlns:mydata="http://my.example.com/mydata" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" targetNamespace="http://my.example.com/mydata" elementFormDefault="unqualified" attributeFormDefault="unqualified" version="0.2" xml:lang="en" jaxb:version="2.0">
XSD의 루트 요소 바로 뒤에 삽입 된 JAXB 바인딩 주석 블록 :
<xs:annotation>
<xs:appinfo>
<jaxb:globalBindings>
<jaxb:javaType name="java.util.Calendar" xmlType="xs:dateTime" parseMethod="javax.xml.bind.DatatypeConverter.parseDateTime" printMethod="javax.xml.bind.DatatypeConverter.printDateTime" />
</jaxb:globalBindings>
</xs:appinfo>
</xs:annotation>
XML xs : dateTime 필드도 시간대를 저장하기 때문에 Calendar 객체에는 로케일 및 시간대 작업을위한 꽤 좋은 API가 있기 때문에 어쨌든 Date 대신 Calendar로 작업하는 것이 더 나을 수 있습니다. 어쨌든 XMLGregorianCalendar 대신 Calendar 객체를 다루는 것이 훨씬 더 행복합니다. 더 이상 위에 나열된 변환 방법이 필요하지 않습니다. 나는 java.util.Date까지 얻지 못했지만 충분히 가까웠다!
util
. 패키지에 넣고 사용하십시오.