java.util.Date到XMLGregorianCalendar

没有从java.util.Date到XMLGregorianCalendar的简便方法吗?

GregorianCalendar c = new GregorianCalendar(); c.setTime(yourDate); XMLGregorianCalendar date2 = DatatypeFactory.newInstance().newXMLGregorianCalendar(c); 

对于那些可能最终在这里寻找相反的转换(从XMLGregorianCalendarDate ):

 XMLGregorianCalendar xcal = <assume this is initialized>; java.util.Date dt = xcal.toGregorianCalendar().getTime(); 

这里是一个从GregorianCalendar转换为XMLGregorianCalendar的方法; 我将离开从java.util.Date到GregorianCalendar的转换部分作为练习:

 import java.util.GregorianCalendar; import javax.xml.datatype.DatatypeFactory; import javax.xml.datatype.XMLGregorianCalendar; public class DateTest { public static void main(final String[] args) throws Exception { GregorianCalendar gcal = new GregorianCalendar(); XMLGregorianCalendar xgcal = DatatypeFactory.newInstance() .newXMLGregorianCalendar(gcal); System.out.println(xgcal); } } 

编辑:Slooow 🙂

使用Joda-Time库的一个例子是:

 XMLGregorianCalendar xgc = DatatypeFactory.newInstance().newXMLGregorianCalendar(new DateTime().toGregorianCalendar()); 

感谢Nicolas Mommaerts从他接受的答复中的评论。

只是以为我会在下面添加我的解决scheme,因为上面的答案不符合我的确切需求。 我的Xml架构需要单独的date和时间元素,而不是一个单一的DateTime字段。 上面使用的标准XMLGregorianCalendar构造函数将生成一个DateTime字段

注意有几个gothca,比如不得不在一个月内加一个(因为java从0开始计数)。

 GregorianCalendar cal = new GregorianCalendar(); cal.setTime(yourDate); XMLGregorianCalendar xmlDate = DatatypeFactory.newInstance().newXMLGregorianCalendarDate(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH)+1, cal.get(Calendar.DAY_OF_MONTH), 0); XMLGregorianCalendar xmlTime = DatatypeFactory.newInstance().newXMLGregorianCalendarTime(cal.get(Calendar.HOUR_OF_DAY), cal.get(Calendar.MINUTE), cal.get(Calendar.SECOND), 0); 

我希望我的编码是正确的; D为了更快地使用GregorianCalendar的丑陋的getInstance()调用,而不是构造函数调用:

 import java.util.GregorianCalendar; import javax.xml.datatype.DatatypeFactory; import javax.xml.datatype.XMLGregorianCalendar; public class DateTest { public static void main(final String[] args) throws Exception { // do not forget the type cast :/ GregorianCalendar gcal = (GregorianCalendar) GregorianCalendar.getInstance(); XMLGregorianCalendar xgcal = DatatypeFactory.newInstance() .newXMLGregorianCalendar(gcal); System.out.println(xgcal); } } 

假设您正在解码或编码xml并使用JAXB ,那么可以完全replacedateTime绑定,并且为架构中的每个date使用“XMLGregorianCalendar”以外的内容。

通过这种方式,您可以让JAXB执行重复的工作,而您可以花时间编写出色的代码,从而实现价值。

jodatime DateTime示例:(使用java.util.Date也可以,但有一定的限制,我更喜欢jodatime,它是从我的代码中复制的,所以我知道它的工作原理…)

 <jxb:globalBindings> <jxb:javaType name="org.joda.time.LocalDateTime" xmlType="xs:dateTime" parseMethod="test.util.JaxbConverter.parseDateTime" printMethod="se.seb.bis.test.util.JaxbConverter.printDateTime" /> <jxb:javaType name="org.joda.time.LocalDate" xmlType="xs:date" parseMethod="test.util.JaxbConverter.parseDate" printMethod="test.util.JaxbConverter.printDate" /> <jxb:javaType name="org.joda.time.LocalTime" xmlType="xs:time" parseMethod="test.util.JaxbConverter.parseTime" printMethod="test.util.JaxbConverter.printTime" /> <jxb:serializable uid="2" /> </jxb:globalBindings> 

而转换器:

 public class JaxbConverter { static final DateTimeFormatter dtf = ISODateTimeFormat.dateTimeNoMillis(); static final DateTimeFormatter df = ISODateTimeFormat.date(); static final DateTimeFormatter tf = ISODateTimeFormat.time(); public static LocalDateTime parseDateTime(String s) { try { if (StringUtils.trimToEmpty(s).isEmpty()) return null; LocalDateTime r = dtf.parseLocalDateTime(s); return r; } catch (Exception e) { throw new IllegalArgumentException(e); } } public static String printDateTime(LocalDateTime d) { try { if (d == null) return null; return dtf.print(d); } catch (Exception e) { throw new IllegalArgumentException(e); } } public static LocalDate parseDate(String s) { try { if (StringUtils.trimToEmpty(s).isEmpty()) return null; return df.parseLocalDate(s); } catch (Exception e) { throw new IllegalArgumentException(e); } } public static String printDate(LocalDate d) { try { if (d == null) return null; return df.print(d); } catch (Exception e) { throw new IllegalArgumentException(e); } } public static String printTime(LocalTime d) { try { if (d == null) return null; return tf.print(d); } catch (Exception e) { throw new IllegalArgumentException(e); } } public static LocalTime parseTime(String s) { try { if (StringUtils.trimToEmpty(s).isEmpty()) return null; return df.parseLocalTime(s); } catch (Exception e) { throw new IllegalArgumentException(e); } } 

看到这里: 如何取代dateXmlGregorianCalendar?

如果你很乐意根据时区+时间戳映射到一个瞬间,并且原来的时区并不真正相关,那么java.util.Date也可能是好的。

看看这个代码:

 /* Create Date Object */ Date date = new Date(); XMLGregorianCalendar xmlDate = null; GregorianCalendar gc = new GregorianCalendar(); gc.setTime(date); try{ xmlDate = DatatypeFactory.newInstance().newXMLGregorianCalendar(gc); } catch(Exception e){ e.printStackTrace(); } System.out.println("XMLGregorianCalendar :- " + xmlDate); 

你可以在这里看到完整的例子