Month字段的值0无效。将util.date转换为XMLgregoriandate时?

时间:2011-04-01 06:02:17

标签: java date java.util.date

我正在将java.util.Date转换为XMLGregorianDate。

当我在控制台上打印我的工具日期时,它会显示:

  

日期:2011-01-25 20:33:46.54

但转换后,当我尝试使用它时,给我以下异常: org.springframework.ws.soap.client.SoapFaultClientException:Month字段的值0无效。

Code for Date conversion is:
 DatatypeFactory df = null;

                    try {
                        df = DatatypeFactory.newInstance();
                    } catch (DatatypeConfigurationException e) {
                        e.printStackTrace();
                    }

            GregorianCalendar gc = new GregorianCalendar();
            gc.setTimeInMillis(account.getCreationDate().getTime());

method returns: df.newXMLGregorianCalendar(gc);

同样有趣的是,当我显示util Date.getYear()和getMonth()方法时(不再使用的方法只是在控制台上显示日期),控制台上的输出是:

  

年份:111月:0

为什么会这样?任何人都能说出这背后的理由吗 提前谢谢。

2 个答案:

答案 0 :(得分:3)

XMLGregorianCalendar,即使我在示例中没有看到它,也使用基于1的月份编号。与java.util.Calendar类不同,后者使用0个月的月号。

答案 1 :(得分:1)

好吧,打印date.getYear()date.getMonth()确实应该打印111和0,因为getYear()返回自1900年以来的年数,getMonth()返回0月。一个疯狂的API肯定,但这是它的记录方式。

你的转换代码并不是很清楚 - 你永远不会使用 df,那么它有什么意义呢?同样,我在代码中看不到XMLGregorianDate的任何提及......你能否提供一个简短但完整的程序来证明这个问题?我们可以建立并运行的东西吗?

作为一个侧面问题,一般情况下,我会衷心地建议尽可能使用Joda Time而不是java.util。{Date,Calendar}。它可能无助于这种特殊情况,但它避免了内置类的许多糟糕的设计决策,并允许您准确表达您的意思(本地日期,当地时间等)。