【问题标题】:Getting Wrong Date Using XMLGregorianCalender使用 XMLGregorianCalender 获取错误的日期
【发布时间】:2018-02-05 23:40:08
【问题描述】:

我正在尝试获取当前日期/时间以填充到 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 运行了这个。

【问题讨论】:

  • Calendar.YEAR 是一个表示年份字段的常量,而不是年份值(它的值为 1,这就是你得到年份 0001 的原因)。您应该改用年份值(例如2017 或您想要的任何值)。其他字段也一样。

标签: java xml calendar xmlgregoriancalendar


【解决方案1】:

查看您传递给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.Datejava.util.Calendar 类与java.time 或其反向移植相比真的很讨厌。

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

    • 感谢大家的解决方案!这有帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-29
    相关资源
    最近更新 更多