字符串到XMLGregorianCalendar问题

时间:2014-03-13 15:49:02

标签: java string date gregorian-calendar

我正在尝试从字符串转换为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;

    }

请帮助,提前致谢。

2 个答案:

答案 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?