【问题标题】:How to print date 9999-99-99 in xmlgregoriancalendar?如何在 xmlgregoriancalendar 中打印日期 9999-99-99?
【发布时间】:2020-01-11 03:37:36
【问题描述】:

需要使用 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);

      } 

}

【问题讨论】:

  • 但是为什么呢? ..... 99 不是有效月份,也不是任何月份的有效日期。不要使用日历,只使用字符串格式
  • 或使用 12-31 作为任何类型的“最大”日期的月日
  • 你不能。这不是一个有效的日期,所以XMLGregorianCalendar 不会接受它。

标签: java xmlgregoriancalendar


【解决方案1】:

不要

XMLGregorianCalendar 类用于 XML 文档的日期和/或时间。假设这也是你的目的,你不能把9999-99-99 放在那里。根据 XML 规则,这不是一个有效的日期。引用XML Schema Part 2: Datatypes Second Edition,附录 D ISO 8601 日期和时间格式

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

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

如果您希望 9999-99-99 用于 XML 文档以外的其他内容,我认为您根本不应该使用 XMLGregorianCalendar。没有上下文,我不敢提出替代方案。

java.time 我说“ ...用于 XML 文档”。 XML 文档中的日期和时间受 ISO 8601 格式的启发,并且足够接近,以至于我们通常可以使用 java.time 中的类,现代 Java 日期和时间 API 而不是 XMLGregorianCalendar,并且仍然可以从 @ 中获得正确的语法987654329@ 这些类的方法。因此,对于有效日期,请考虑使用 java.time 中的现代 LocalDate 而不是旧的 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 的日期,它解释了你得到的输出。

链接

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-09
    • 1970-01-01
    • 2017-06-04
    • 1970-01-01
    • 1970-01-01
    • 2011-02-06
    • 2022-07-23
    • 1970-01-01
    相关资源
    最近更新 更多