23

我想使用日期XMLGregorianCalendar格式发送到 Web 服务。Web 服务需要yyyy-dd-mm格式的信息。我使用下面的代码创建一个XMLGregorianCalendar并将其发送到 Web 服务。

Date dob = null;
DateFormat df = new SimpleDateFormat("dd/MM/yyyy");

try {
    XMLGregorianCalendar date2;
    dob = df.parse("13/06/1983");

    GregorianCalendar c = new GregorianCalendar();
    c.setTimeInMillis(dob.getTime());
    date2 = DatatypeFactory.newInstance().newXMLGregorianCalendar(c);
    System.out.println(date2);
}
catch(DatatypeConfigurationException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
catch(ParseException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

不幸的是,我总是得到日期1983-06-13T00:00:00.000-04:00。时间也包含在输出中。是否可以只获取日期?请你帮助我好吗?

4

5 回答 5

31

您不需要指定“SimpleDateFormat”,这很简单:您必须在不想显示的地方指定常量“DatatypeConstants.FIELD_UNDEFINED”

GregorianCalendar cal = new GregorianCalendar();
cal.setTime(new Date());
XMLGregorianCalendar xmlDate = DatatypeFactory.newInstance().newXMLGregorianCalendarDate(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH)+1, cal.get(Calendar.DAY_OF_MONTH), DatatypeConstants.FIELD_UNDEFINED);
于 2013-10-18T13:27:42.953 回答
16

是的 明白了...

Date dob=null;
DateFormat df=new SimpleDateFormat("dd/MM/yyyy");
dob=df.parse( "13/06/1983" );
GregorianCalendar cal = new GregorianCalendar();
cal.setTime(dob);
XMLGregorianCalendar xmlDate = DatatypeFactory.newInstance().newXMLGregorianCalendarDate(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH)+1, cal.get(Calendar.DAY_OF_MONTH), DatatypeConstants.FIELD_UNDEFINED);

这将以正确的格式给出它。

于 2012-12-27T19:36:05.267 回答
13

仅使用 SimpleDateFormat 更简单,无需单独传递所有参数:

    String FORMATER = "yyyy-MM-dd'T'HH:mm:ss'Z'";

    DateFormat format = new SimpleDateFormat(FORMATER);

    Date date = new Date();
    XMLGregorianCalendar gDateFormatted =
        DatatypeFactory.newInstance().newXMLGregorianCalendar(format.format(date));

完整的例子在这里

注意:这仅适用于删除最后 2 个字段:毫秒和时区,或使用 formatter 删除整个时间组件yyyy-MM-dd

于 2016-05-10T08:28:55.980 回答
3

这是任何格式的简单方法。只需将其更改为所需的格式字符串

XMLGregorianCalendar gregFmt = DatatypeFactory.newInstance().newXMLGregorianCalendar(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss").format(new Date()));
System.out.println(gregFmt);
于 2016-08-05T03:18:51.810 回答
2

没有真正理想的转换,但我想提供几个选项。

java.time

首先,您应该使用LocalDate现代 Java 日期和时间 API from java.time 来解析和保存您的日期。避免DateSimpleDateFormat因为它们存在设计问题并且已经过时了。后者尤其是出了名的麻烦。

    DateTimeFormatter originalDateFormatter = DateTimeFormatter.ofPattern("dd/MM/uuuu");

    String dateString = "13/06/1983";
    LocalDate date = LocalDate.parse(dateString, originalDateFormatter);
    System.out.println(date);

输出是:

1983-06-13

你还需要更进一步吗?LocalDate.toString()产生您询问的格式。

格式化和解析

假设您确实需要XMLGregorianCalendar第一个也是简单的转换选项:

    XMLGregorianCalendar xmlDate = DatatypeFactory.newInstance()
            .newXMLGregorianCalendar(date.toString());
    System.out.println(xmlDate);

1983-06-13

格式化为字符串并将其解析回对我来说感觉像是一种浪费,但正如我所说,这很容易,而且我认为结果符合预期不会有任何意外。

分别传递年、月和日

    XMLGregorianCalendar xmlDate = DatatypeFactory.newInstance()
            .newXMLGregorianCalendarDate(date.getYear(), date.getMonthValue(),
                    date.getDayOfMonth(), DatatypeConstants.FIELD_UNDEFINED);

结果和以前一样。我们需要明确表示我们不想要时区偏移(这是DatatypeConstants.FIELD_UNDEFINED指定的)。万一有人想知道,LocalDateXMLGregorianCalendar人类一样数月,所以没有加或减 1。

通过公历转换

我只向您展示此选项,因为我以某种方式将其视为官方方式:转换LocalDateZonedDateTime,然后转换为 ,GregorianCalendar最后转换为XMLGregorianCalendar

    ZonedDateTime dateTime = date.atStartOfDay(ZoneOffset.UTC);
    GregorianCalendar gregCal = GregorianCalendar.from(dateTime);
    XMLGregorianCalendar xmlDate = DatatypeFactory.newInstance()
            .newXMLGregorianCalendar(gregCal);
    xmlDate.setTime(DatatypeConstants.FIELD_UNDEFINED, DatatypeConstants.FIELD_UNDEFINED,
            DatatypeConstants.FIELD_UNDEFINED, DatatypeConstants.FIELD_UNDEFINED);
    xmlDate.setTimezone(DatatypeConstants.FIELD_UNDEFINED);

我喜欢转换本身,因为我们既不需要使用字符串,也不需要传递单个字段(注意以正确的顺序进行)。我不喜欢的是我们必须传递一天中的时间和时区偏移量,然后手动清除这些字段。

于 2019-02-15T11:16:21.167 回答