我正在尝试从字符串转换为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;
}
请帮助,提前致谢。
答案 0 :(得分:3)
请参阅下文,了解现有代码为何不适合您的原因以及解决方法。但是,为了保留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
没有&#39 ; t维护这些信息。 (它只是一个瞬间。)
顺便说一句,我强烈建议你改变你的异常处理策略 - 简单地返回null
并继续,好像一切都很好很少是一个好主意。通常 通常更好的想法是让异常传播或将其包装在更合适的异常类型中(可能是运行时异常)。
答案 1 :(得分:0)
System.out.println("converted " + converted);
这将使用转换后的toString()方法。你可能想在这里使用你的SimpleDateFormat?