java - 字符串到 XMLGregorianCalendar 问题

标签 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;

    }

请帮助,在此先感谢。

最佳答案

请参阅下文了解现有代码为何不适合您以及解决方法。然而,为了保留 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/

相关文章:

java - Android 3D Java 开源游戏引擎,支持OpenGL ES 3.0

java - 退出 OPENCV 248 JAVA 后网络摄像头应用程序不会关闭

java - 安卓测试 : What do to when nothing has an id?

java - 在 ByteBuffer 中编码的字符串的长度是多少

java - jsp中的日期格式

java - android unicode 到可读字符串

c - 字符串常量和字符常量

java - 如何在每个管道前面插入反斜杠

java - Java日历日期,2014-02-16跳过一小时

r - 根据更改的日期范围自动子集 R 数据框