使用XMLGregorianCalender获取错误的日期

时间:2017-08-28 16:23:49

标签: java xml calendar xmlgregoriancalendar

我正在尝试获取填充XML的当前日期/时间。我正在使用代码

XMLGregorianCalendar xmlDate = null;
try {
    xmlDate = DatatypeFactory.newInstance().newXMLGregorianCalendar(Calendar.YEAR, Calendar.MONTH+1, Calendar.DAY_OF_MONTH, Calendar.HOUR, Calendar.MINUTE, Calendar.SECOND, DatatypeConstants.FIELD_UNDEFINED, TimeZone.LONG).normalize();
    lastUpdatetDateTime.setTextContent(xmlDate.toXMLFormat());
} catch (DatatypeConfigurationException e) {
}

但我得到的输出为0001-03-05T10:11:13Z,据我所知,我们是在2017年! :)

即便是时间慢了8分钟。我是在中部标准时间上午11:21运行的。

2 个答案:

答案 0 :(得分:3)

查看您传递给newXMLGregorianCalendar的论据:

[...].newXMLGregorianCalendar(Calendar.YEAR, Calendar.MONTH+1, 
   Calendar.DAY_OF_MONTH, Calendar.HOUR, Calendar.MINUTE, Calendar.SECOND,
   DatatypeConstants.FIELD_UNDEFINED, TimeZone.LONG).

Calendar.YEARCalendar.MONTH等值是常量,用于指代日历的特定部分。你通常会像这样使用它们:

Calendar calendar = ...;
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH);
// etc

如果您想为当前日期/时间创建XMLGregorianCalendar,看起来您需要明确地执行此操作:

Calendar calendar = new GregorianCalendar();
xmlDate = DatatypeFactory.newInstance().newXMLGregoriantCalendar(
    calendar.get(Calendar.YEAR),
    calendar.get(Calendar.MONTH) + 1,
    // etc
    );

更好的是,如果可能的话,请使用java.time类 - 与java.util.Date或其后端相比,java.util.Calendarjava.time类非常讨厌。

答案 1 :(得分:2)

当您致电newXMLGregorianCalendar()时,您需要提供您要创建的日期的年,月,日等。

你的代码传递了指定各个字段的内部常量,这些字段将是与今天的日期或其他任何东西完全无关的小整数。

您需要修改该行以提供您要创建的日期/时间的实际值。例如:

GregorianCalendar now - new GregorianCalendar();
xmlDate = DatatypeFactory.newInstance().newXMLGregorianCalendar(now);