1

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

当我在控制台上打印 My util date 时,它​​显示:

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

但转换后,当我尝试使用它时,出现以下异常:org.springframework.ws.soap.client.SoapFaultClientException:月份字段的值无效 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

为什么会这样?谁能说出这背后的原因?先感谢您。

4

2 回答 2

3

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

于 2011-04-01T06:45:51.913 回答
1

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

不过,您的转换代码并不是很清楚-您从未使用 df过,那有什么意义呢?同样,我在您的代码中看不到任何提及XMLGregorianDate...您能否提供一个简短但完整的程序来演示该问题?我们可以构建和运行的东西?

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

于 2011-04-01T06:07:10.200 回答