java.util.Date到XMLGregorianCalendar
没有从java.util.Date到XMLGregorianCalendar的简便方法吗?
GregorianCalendar c = new GregorianCalendar(); c.setTime(yourDate); XMLGregorianCalendar date2 = DatatypeFactory.newInstance().newXMLGregorianCalendar(c);
对于那些可能最终在这里寻找相反的转换(从XMLGregorianCalendar
到Date
):
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);
你可以在这里看到完整的例子