我正在尝试将字符串转换为 XML 公历日期,它总是返回一个新实例,请检查下面的代码
输入日期::2014-03-13 15:34:33 +0000
期望的输出日期::2014-03-13 15:34:33 +0000
但是当我使用下面的代码进行转换时,输出是 2014-03-13T11:34:33.000-04:00
public static void convertXMLGregorian() throws DatatypeConfigurationException {
TimeZone utc = TimeZone.getTimeZone("UTC");
GregorianCalendar gc = new GregorianCalendar();
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z");
XMLGregorianCalendar xc=DatatypeFactory.newInstance().newXMLGregorianCalendar(gc);
String xcs = df.format(xc.toGregorianCalendar().getTime());
XMLGregorianCalendar converted = stringToXMLGregorianCalendar(xcs, df);
System.out.println("converted " + converted);
// output :: 2014-03-13T11:34:33.000-04:00
// String conversion methods
private static XMLGregorianCalendar dateToXMLGregorianCalendar(Date date) {
try {
GregorianCalendar gc = (GregorianCalendar) GregorianCalendar
.getInstance();
gc.setTime(date);
return DatatypeFactory.newInstance().newXMLGregorianCalendar(gc);
} catch (DatatypeConfigurationException e) {
System.out.print(e.getMessage());
return null;
}
}
private static XMLGregorianCalendar stringToXMLGregorianCalendar(
String datetime, SimpleDateFormat sdf) {
try {
Date date = sdf.parse(datetime);
return dateToXMLGregorianCalendar(date);
} catch (ParseException e) {
System.out.print(e.getMessage());
return null;
}
请帮助,在此先感谢。
最佳答案
请参阅下文了解现有代码为何不适合您以及解决方法。然而,为了保留 UTC 偏移量 和 做整个事情要简单得多,我怀疑你只是想使用 DatatypeFactory.newXMLGregorianCalendar(String)
:
// This replaces *all* of the code in the question
XMLGregorianCalendar result = DatatypeFactory.newInstance().newXMLGregorianCalendar(datetime);
这里唯一美中不足的是,您的输入看起来没有 T
,而规范的 XML 表示却有。这很容易修复:
// The only place you've got a space is exactly where you want a T.
datetime = datetime.replace(' ', 'T');
XMLGregorianCalendar result = DatatypeFactory.newInstance().newXMLGregorianCalendar(datetime);
原始答案
我怀疑是这个问题:
GregorianCalendar gc = (GregorianCalendar) GregorianCalendar.getInstance();
这将在默认时区创建一个日历。
如果您始终希望 UTC 偏移量为 0,只需使用:
gc.setTimeZone(TimeZone.getTimeZone("Etc/UTC"));
如果您试图保留原始文本中的 UTC 偏移量,那就另当别论了 - 您不能用当前的方法做到这一点,因为 Date
不保留该信息。 (这只是一个瞬间。)
顺便说一句,我强烈建议您更改您的异常处理策略 - 简单地返回 null
并继续好像一切都很好很少是一个好主意。让异常传播或将其包装在更合适的异常类型(可能是运行时异常)中通常是一个更好的主意。
关于java - 字符串到 XMLGregorianCalendar 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22383875/