-2

需要使用 xmlgregoriancalendar 类型将日期完全打印为“9999-99-99”。当我通过“9999-99-99”时,我得到错误的输出:10007-07-08。我如何获得与 9999-99-99 完全相同的输出

import java.util.GregorianCalendar;
import javax.xml.datatype.DatatypeFactory;

public class XMLGregorianCalendar {

  public static void main(String[] args) {

    /* Create Date Object */
    //Date date = new Date();

      javax.xml.datatype.XMLGregorianCalendar xmlDate = null;
      //GregorianCalendar gc = new GregorianCalendar(2001,12,12);
      GregorianCalendar gc = new GregorianCalendar(9999,99,99);
      // gc.setTime(date);

        try{
          xmlDate = DatatypeFactory.newInstance().newXMLGregorianCalendar(gc);
        }catch(Exception e){
          e.printStackTrace();
        }

        System.out.println("XMLGregorianCalendar :- " + xmlDate);

      } 

}
4

1 回答 1

1

该类XMLGregorianCalendar用于 XML 文档的日期和/或时间。假设这也是你的目的,你绝不能放在9999-99-99那里。根据 XML 规则,这不是一个有效的日期。引用XML 模式第 2 部分:数据类型第二版,附录 D ISO 8601 日期和时间格式

  • M -- 表示时间元素“月”中使用的数字。MM 格式中的两位数字的值可以是 1 到 12。
  • D——表示时间元素“天”中使用的数字。如果月份值等于 2,则 DD 格式中的两位数字可以具有从 1 到 28 的值,如果月份值等于 2 并且年份是闰年,则可以具有 1 到 29 的值,如果月份值等于 4、6,则可以具有 1 到 30 的值, 9 或 11,如果月份值等于 1、3、5、7、8、10 或 12,则为 1 到 31。

我已经断章取义了,但我认为我们应该理解 XML 文档中的日期必须是有效的日期。9999-99-99 不是有效日期,因为没有月份 99,也没有月份有 99 天。

如果您想要9999-99-99的不是 XML 文档,我认为您根本不应该使用它XMLGregorianCalendar。没有上下文,我不敢提出替代方案。

java.time我说“<em>是……用于 XML 文档”。XML 文档中的日期和时间受 ISO 8601 格式的启发,并且足够接近,以至于我们通常可以使用 java.time 中的类,现代 Java 日期和时间 API 而不是它们,并且仍然从这些类XMLGregorianCalendar的方法中获得正确的语法toString. 因此,对于有效日期,请考虑使用LocalDatejava.time 中的现代而不是旧的XMLGregorianCalendar

你不能

XMLGregorianCalendar施加有效日期的限制,因此不能打印9999-99-99

您的代码中发生的事情是GregorianCalendar默认且令人困惑地将日期修改为有效日期。尝试例如:

    GregorianCalendar gc = new GregorianCalendar(9999,99,99);
    System.out.println(gc.getTime());

在我的电脑上,我得到:

7 月 8 日星期日 00:00:00 CEST 10007

当给出无效的月份和月份时,GregorianCalendar只需将月份和日期计算到接下来的年份。由于 99 个月比 8 年多一点,所以我们在 9999 年 1 月之后结束了 8 年多,并且由于 99 天,还有 3 个月。这就是你传递给你的日期XMLGregorianCalendar,它解释了你得到的输出。

链接

于 2019-09-11T06:23:47.230 回答