如何解决Java 日期格式:字符串到 XMLGregorianCalendar
我有一个字符串日期,我要转换为 XMLGregorianCalendar
。下面的代码转换它没有错误。但是,我将日期传递给的系统,得到了下面报告的错误。
以下 XMLGregorianCalendar
有效:
以下 XMLGregorianCalendar
不起作用(下面的代码将其转换为此):
问题
如何将字符串转换为所需的格式?
public static void main(String []args){
try {
String commencetoString = "2021-06-30 05:00:00";
java.util.Date dateCommence = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(commencetoString);
System.out.println(dateCommence);
java.util.GregorianCalendar c = new java.util.GregorianCalendar();
c.setTime(dateCommence);
javax.xml.datatype.XMLGregorianCalendar commence = javax.xml.datatype.DatatypeFactory.newInstance().newXMLGregorianCalendar(c);
System.out.println(commence);
} catch (Exception e) {
e.printstacktrace();
}
}
E:消息验证失败。错误:[cvc-pattern-valid:值 '2021-06-30T06:30:00.000+02:00' 不是方面有效的 图案 '((((((0[1-9])|(1[0-2]))-((0[1-9])|(1\d)|(2[0-9]))) |(((((0[13578]))|(1[02]))-31)|((((0[1,3-9])|(1[0-2]))-30)))| (((19|20)(([02468][048])|([13579][26]))-02-29))|(((20[0-9][0-9])|(19) [0-9][0-9]))-((((0[1-9])|(1[0-2]))-((0[1-9])|(1\d) |(2[0-8])))|((((0[13578])|(1[02]))-31)|((((0[1,3-9])|(1[0]) -2]))-(29|30)))))T([0-1][0-9]|[2][0-3])(:([0-5][0-9] )){1,2}' 对于类型 'dateTime'.cvc-attribute.3:值 '2021-06-30T06:30:00.000+02:00' 属性 'DepartureDateTime' on 元素“FlightSegment”在其类型方面无效, '约会时间'。]。 http://www.elleipsis.com/booking/exception/35a8ac87-6743-4719-9504-a8a17a1a0471
解决方法
有很多方法可以做到这一点。通常,我建议您使用 java.time 进行日期和时间工作,在 java.time 类和 XMLGregorianCalendar
之间没有直接转换的情况下也是如此。
黑客
hack 只是将 T
编辑为 XMLGregorianCalendar
期望出现的字符串,然后直接解析修改后的字符串。那么我们既不需要 java.time 也不需要 Date
或 SimpleDateFormat
。
String commenceTOString = "2021-06-30 05:00:00";
XMLGregorianCalendar commence = DatatypeFactory.newInstance()
.newXMLGregorianCalendar(commenceTOString.replace(' ','T'));
System.out.println(commence);
输出:
2021-06-30T05:00:00
通过字符串转换
解析成LocalDateTime
,格式化成XMLGregorianCalendar
知道的格式字符串,让DatatypeFactory
再次解析:
DateTimeFormatter parser = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss");
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss");
LocalDateTime dateTime = LocalDateTime.parse(commenceTOString,parser);
XMLGregorianCalendar commence = DatatypeFactory.newInstance()
.newXMLGregorianCalendar(dateTime.format(formatter));
System.out.println(commence);
输出和之前一样。
通过数字转换
虽然多了几行,但这是概念上简单的转换:将每个字段从 LocalDateTime
转移到 XMLGregorianCalendar
。
XMLGregorianCalendar commence = DatatypeFactory.newInstance()
.newXMLGregorianCalendar(
dateTime.getYear(),dateTime.getMonthValue(),dateTime.getDayOfMonth(),dateTime.getHour(),dateTime.getMinute(),dateTime.getSecond(),DatatypeConstants.FIELD_UNDEFINED,DatatypeConstants.FIELD_UNDEFINED);
System.out.println(commence);
输出还是一样。
通过公历转换
我相信这是官方的转换:转换为 ZonedDateTime
到 GregorianCalendar
,最后转换为 XMLGregorianCalendar
。我们需要将不需要的字段设置为 FIELD_UNDEFINED
,就像您自己的答案一样。
ZonedDateTime dateTime = LocalDateTime.parse(commenceTOString,parser)
.atZone(ZoneOffset.UTC);
GregorianCalendar gc = GregorianCalendar.from(dateTime);
XMLGregorianCalendar commence = DatatypeFactory.newInstance()
.newXMLGregorianCalendar(gc);
commence.setTimezone(DatatypeConstants.FIELD_UNDEFINED);
commence.setMillisecond(DatatypeConstants.FIELD_UNDEFINED);
System.out.println(commence);
链接
Oracle tutorial: Date Time 解释如何使用 java.time。
,这为我修复了它:(使用 DatatypeConstants.FIELD_UNDEFINED
)
GregorianCalendar c = new GregorianCalendar();
c.setTime(dateCommence);
XMLGregorianCalendar commence = DatatypeFactory.newInstance().newXMLGregorianCalendar(c);
commence.setTimezone(DatatypeConstants.FIELD_UNDEFINED);
commence.setMillisecond(DatatypeConstants.FIELD_UNDEFINED);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。