xml-java。util。日期至xmlgoriancalendar 4 月,3 周 Questions & Answers 632442 难道没有一种从java获取信息的便捷方法吗。util。到一个XMLGregorianCalendar的日期
# 1 楼答案 我只是想在下面添加我的解决方案,因为上面的答案不符合我的确切需求。我的Xml模式需要单独的日期和时间元素,而不是一个单独的日期时间字段。上面使用的标准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);
# 2 楼答案 使用Joda-Time库的一行示例: XMLGregorianCalendar xgc = DatatypeFactory.newInstance().newXMLGregorianCalendar(new DateTime().toGregorianCalendar()); 他在the accepted answer中的评论归功于Nicolas Mommaerts
# 3 楼答案 下面是一种将GregorianCalendar转换为XMLGregorianCalendar的方法;我将留下从java转换的部分。util。与Gregorianalendar约会,作为你的练习: 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); } } 编辑:Sloow:-)
# 4 楼答案 对于那些可能最终在这里寻找相反转换(从XMLGregorianCalendar到Date)的人: XMLGregorianCalendar xcal = <assume this is initialized>; java.util.Date dt = xcal.toGregorianCalendar().getTime();
# 5 楼答案 我想退一步,用现代的眼光来看待这个10年前的问题。上面提到的类Date和XMLGregorianCalendar现在已经很旧了。我对它们的使用提出质疑,并提供替代方案 Date的设计总是很糟糕,而且已经有20多年的历史了。这很简单:不要使用它李> XMLGregorianCalendar也很古老,设计也很老式。据我所知,它用于以XML格式为XML文档生成日期和时间。比如2009-05-07T19:05:45.678+02:00或者2009-05-07T17:05:45.678Z。这些格式与ISO 8601非常一致,即java的类。现代Java日期和时间API time可以生成我们更喜欢的数据和时间李> 不需要转换 对很多人来说(大多数?)目的Date的现代替代品将是Instant。一个Instant是一个时间点(就像一个Date一样) Instant yourInstant = // ... System.out.println(yourInstant); 此代码段的输出示例如下: 2009-05-07T17:05:45.678Z 这与上面我的示例XMLGregorianCalendar字符串的后一个相同。正如你们大多数人所知,它来自Instant.toString被System.out.println隐式调用。用java。时间,在许多情况下,我们不需要以前在Date、Calendar、XMLGregorianCalendar和其他类之间进行的转换(在某些情况下,我们确实需要转换,不过,我在下一节中向您展示一些转换) 控制偏移量 无论是Date还是Instant都没有时区或UTC偏移量。Ben Noland之前接受的、投票率仍然最高的答案使用JVM当前的默认时区来选择XMLGregorianCalendar的偏移量。为了在现代对象中包含偏移量,我们使用OffsetDateTime。例如: ZoneId zone = ZoneId.of("America/Asuncion"); OffsetDateTime dateTime = yourInstant.atZone(zone).toOffsetDateTime(); System.out.println(dateTime); 2009-05-07T13:05:45.678-04:00 这同样符合XML格式。如果要再次使用当前的JVM时区设置,请将zone设置为ZoneId.systemDefault() 如果我真的需要一个XMLGregorianCalendar呢 有更多的方法可以将Instant转换为XMLGregorianCalendar。我将介绍几个例子,每个都有其优点和缺点。首先,正如XMLGregorianCalendar生成类似2009-05-07T17:05:45.678Z的字符串一样,它也可以从这样的字符串构建: String dateTimeString = yourInstant.toString(); XMLGregorianCalendar date2 = DatatypeFactory.newInstance().newXMLGregorianCalendar(dateTimeString); System.out.println(date2); 2009-05-07T17:05:45.678Z 赞成者:它很短,我认为它不会给人任何惊喜。缺点:对我来说,将瞬间格式化为字符串并重新解析它就像是一种浪费 ZonedDateTime dateTime = yourInstant.atZone(zone); GregorianCalendar c = GregorianCalendar.from(dateTime); XMLGregorianCalendar date2 = DatatypeFactory.newInstance().newXMLGregorianCalendar(c); System.out.println(date2); 2009-05-07T13:05:45.678-04:00 赞成者:这是官方的转换。控制偏移量是自然而然的。缺点:它需要更多的步骤,因此更长 如果我们有约会呢 如果您从旧式API获得了一个过时的Date对象,而您现在无法更改它,请将其转换为Instant: Instant i = yourDate.toInstant(); System.out.println(i); 输出与之前相同: 2009-05-07T17:05:45.678Z 如果要控制偏移量,请按上述方法进一步转换为OffsetDateTime 如果你有一个老式的Date并且绝对需要一个老式的XMLGregorianCalendar,只需使用Ben Noland的答案 链接 Oracle tutorial: Date Time解释如何使用java。时间到了李> ^关于W3学校李> Wikipedia article: ISO 8601
# 6 楼答案 GregorianCalendar c = new GregorianCalendar(); c.setTime(yourDate); XMLGregorianCalendar date2 = DatatypeFactory.newInstance().newXMLGregorianCalendar(c);
# 1 楼答案
我只是想在下面添加我的解决方案,因为上面的答案不符合我的确切需求。我的Xml模式需要单独的日期和时间元素,而不是一个单独的日期时间字段。上面使用的标准XMLGregorianCalendar构造函数将生成一个DateTime字段
注意这里有几个gothca,比如必须在月份中添加一个(因为java从0开始计算月份)
# 2 楼答案
使用Joda-Time库的一行示例:
他在the accepted answer中的评论归功于Nicolas Mommaerts
# 3 楼答案
下面是一种将GregorianCalendar转换为XMLGregorianCalendar的方法;我将留下从java转换的部分。util。与Gregorianalendar约会,作为你的练习:
编辑:Sloow:-)
# 4 楼答案
对于那些可能最终在这里寻找相反转换(从
XMLGregorianCalendar
到Date
)的人:# 5 楼答案
我想退一步,用现代的眼光来看待这个10年前的问题。上面提到的类
Date
和XMLGregorianCalendar
现在已经很旧了。我对它们的使用提出质疑,并提供替代方案Date
的设计总是很糟糕,而且已经有20多年的历史了。这很简单:不要使用它李>XMLGregorianCalendar
也很古老,设计也很老式。据我所知,它用于以XML格式为XML文档生成日期和时间。比如2009-05-07T19:05:45.678+02:00
或者2009-05-07T17:05:45.678Z
。这些格式与ISO 8601非常一致,即java的类。现代Java日期和时间API time可以生成我们更喜欢的数据和时间李>不需要转换
对很多人来说(大多数?)目的
Date
的现代替代品将是Instant
。一个Instant
是一个时间点(就像一个Date
一样)此代码段的输出示例如下:
这与上面我的示例
XMLGregorianCalendar
字符串的后一个相同。正如你们大多数人所知,它来自Instant.toString
被System.out.println
隐式调用。用java。时间,在许多情况下,我们不需要以前在Date
、Calendar
、XMLGregorianCalendar
和其他类之间进行的转换(在某些情况下,我们确实需要转换,不过,我在下一节中向您展示一些转换)控制偏移量
无论是
Date
还是Instant
都没有时区或UTC偏移量。Ben Noland之前接受的、投票率仍然最高的答案使用JVM当前的默认时区来选择XMLGregorianCalendar
的偏移量。为了在现代对象中包含偏移量,我们使用OffsetDateTime
。例如:这同样符合XML格式。如果要再次使用当前的JVM时区设置,请将
zone
设置为ZoneId.systemDefault()
如果我真的需要一个XMLGregorianCalendar呢
有更多的方法可以将
Instant
转换为XMLGregorianCalendar
。我将介绍几个例子,每个都有其优点和缺点。首先,正如XMLGregorianCalendar
生成类似2009-05-07T17:05:45.678Z
的字符串一样,它也可以从这样的字符串构建:赞成者:它很短,我认为它不会给人任何惊喜。缺点:对我来说,将瞬间格式化为字符串并重新解析它就像是一种浪费
赞成者:这是官方的转换。控制偏移量是自然而然的。缺点:它需要更多的步骤,因此更长
如果我们有约会呢
如果您从旧式API获得了一个过时的
Date
对象,而您现在无法更改它,请将其转换为Instant
:输出与之前相同:
如果要控制偏移量,请按上述方法进一步转换为
OffsetDateTime
如果你有一个老式的
Date
并且绝对需要一个老式的XMLGregorianCalendar
,只需使用Ben Noland的答案链接
# 6 楼答案