1. 概述

在这个教程中,我们将探讨将字符串日期转换为XMLGregorianCalendar的不同方法。

2. XMLGregorianCalendar

XML Schema 标准为XML格式中的日期定义了明确的规则。为了使用这种格式,Java 1.5引入的XMLGregorianCalendar类代表了W3C XML Schema 1.0中的日期/时间数据类型。

javax.xml.datatype.DatatypeFactory包中的DatatypeFactory类提供了创建各种XML内置类型实例的工厂方法。我们将使用这个类来生成一个新的XMLGregorianCalendar实例。

3. 字符串日期到XMLGregorianCalendar

首先,我们将看看如何将没有时间戳的字符串日期转换为XMLGregorianCalendar。常用的日期表示模式是yyyy-MM-dd

3.1. 使用标准DatatypeFactory

以下是一个使用DatatypeFactory将日期字符串解析为XMLGregorianCalendar的例子:

XMLGregorianCalendar usingDatatypeFactoryForDate(String dateString) throws DatatypeConfigurationException {
    return DatatypeFactory.newInstance().newXMLGregorianCalendar(dateString);
}

在上述示例中,newXMLGregorianCalendar()方法根据日期的字符串表示创建一个XMLGregorianCalendar实例。我们提供的日期遵循XML schema的dateTime数据类型。

让我们通过转换创建一个XMLGregorianCalendar实例:

void givenStringDate_whenUsingDatatypeFactory_thenConvertToXMLGregorianCalendar() throws DatatypeConfigurationException {
    String dateAsString = "2014-04-24";
    XMLGregorianCalendar xmlGregorianCalendar = StringDateToXMLGregorianCalendarConverter.usingDatatypeFactoryForDate(dateAsString);
    assertEquals(24, xmlGregorianCalendar.getDay());
    assertEquals(4, xmlGregorianCalendar.getMonth());
    assertEquals(2014, xmlGregorianCalendar.getYear());
}

3.2. 使用LocalDate

LocalDate不可变且线程安全的类,它只包含日期值,不包含时间部分。在这种方法中,我们将首先将字符串日期转换为LocalDate实例,然后再将其转换为XMLGregorianCalendar

XMLGregorianCalendar usingLocalDate(String dateAsString) throws DatatypeConfigurationException {
    LocalDate localDate = LocalDate.parse(dateAsString);
    return DatatypeFactory.newInstance().newXMLGregorianCalendar(localDate.toString());
}

下面是测试代码:

void givenStringDateTime_whenUsingApacheCommonsLang3_thenConvertToXMLGregorianCalendar() throws DatatypeConfigurationException {
    XMLGregorianCalendar xmlGregorianCalendar = StringDateToXMLGregorianCalendarConverter.usingLocalDate(dateAsString);
    assertEquals(24, xmlGregorianCalendar.getDay());
    assertEquals(4, xmlGregorianCalendar.getMonth());
    assertEquals(2014, xmlGregorianCalendar.getYear());
}

4. 字符串日期和时间到XMLGregorianCalendar

现在,我们将探讨将带有时间戳的字符串日期转换为XMLGregorianCalendar的方法。通常使用的日期和时间表示模式是yyyy-MM-dd'T'HH:mm:ss

4.1. 使用SimpleDateFormat

将带有时间戳的日期转换为XMLGregorianCalendar的传统方法之一是使用SimpleDateFormat类。让我们从dateTimeAsString创建一个XMLGregorianCalendar实例:

XMLGregorianCalendar usingSimpleDateFormat(String dateTimeAsString) throws DatatypeConfigurationException, ParseException {
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
    Date date = simpleDateFormat.parse(dateTimeAsString);
    return DatatypeFactory.newInstance().newXMLGregorianCalendar(simpleDateFormat.format(date));
}

我们使用SimpleDateFormat将输入字符串dateTime解析为Date对象,然后将Date对象格式化回字符串,再创建XMLGregorianCalendar实例。

让我们测试这种方法:

void givenStringDateTime_whenUsingSimpleDateFormat_thenConvertToXMLGregorianCalendar() throws DatatypeConfigurationException, ParseException {
    XMLGregorianCalendar xmlGregorianCalendar = StringDateToXMLGregorianCalendarConverter.usingSimpleDateFormat(dateTimeAsString);
    assertEquals(24, xmlGregorianCalendar.getDay());
    assertEquals(4, xmlGregorianCalendar.getMonth());
    assertEquals(2014, xmlGregorianCalendar.getYear());
    assertEquals(15, xmlGregorianCalendar.getHour());
    assertEquals(45, xmlGregorianCalendar.getMinute());
    assertEquals(30, xmlGregorianCalendar.getSecond());
}

4.2. 使用GregorianCalendar

GregorianCalendarjava.util.Calendar抽象类的一个具体实现。让我们使用GregorianCalendar类将字符串日期和时间转换为XMLGregorianCalendar

XMLGregorianCalendar usingGregorianCalendar(String dateTimeAsString) throws DatatypeConfigurationException, ParseException {
    GregorianCalendar calendar = new GregorianCalendar();
    calendar.setTime(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss").parse(dateTimeAsString));
    return DatatypeFactory.newInstance().newXMLGregorianCalendar(calendar);
}

首先,我们创建一个GregorianCalendar实例,并根据解析的Date设置其时间。然后,我们使用DatatypeFactory创建一个XMLGregorianCalendar实例。让我们测试这个方法:

void givenStringDateTime_whenUsingGregorianCalendar_thenConvertToXMLGregorianCalendar() throws DatatypeConfigurationException, ParseException {
    XMLGregorianCalendar xmlGregorianCalendar = StringDateToXMLGregorianCalendarConverter.usingGregorianCalendar(dateTimeAsString);
    assertEquals(24, xmlGregorianCalendar.getDay());
    assertEquals(4, xmlGregorianCalendar.getMonth());
    assertEquals(2014, xmlGregorianCalendar.getYear());
    assertEquals(15, xmlGregorianCalendar.getHour());
    assertEquals(45, xmlGregorianCalendar.getMinute());
    assertEquals(30, xmlGregorianCalendar.getSecond());
}

4.3. 使用Joda-Time

Joda-Time是Java中流行的日期和时间处理库,它提供了对标准Java日期和时间API的替代方案,具有更直观的接口。

让我们探索如何使用Joda-Time将字符串日期和时间转换为XMLGregorianCalendar

XMLGregorianCalendar usingJodaTime(String dateTimeAsString) throws DatatypeConfigurationException {
    DateTime dateTime = DateTime.parse(dateTimeAsString, DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss"));
    return DatatypeFactory.newInstance().newXMLGregorianCalendar(dateTime.toGregorianCalendar());
}

在这里,我们从提供的dateTimeAsString值创建了一个DateTime对象。然后,我们使用toGregorianCalendar()方法将dateTime对象转换为GregorianCalendar实例。最后,我们使用DatatypeFactory类的newXMLGregorianCalendar()方法创建了一个XMLGregorianCalendar实例。

让我们测试这个方法:

void givenStringDateTime_whenUsingJodaTime_thenConvertToXMLGregorianCalendar() throws DatatypeConfigurationException {
    XMLGregorianCalendar xmlGregorianCalendar = StringDateToXMLGregorianCalendarConverter.usingJodaTime(dateTimeAsString);
    assertEquals(24, xmlGregorianCalendar.getDay());
    assertEquals(4, xmlGregorianCalendar.getMonth());
    assertEquals(2014, xmlGregorianCalendar.getYear());
    assertEquals(15, xmlGregorianCalendar.getHour());
    assertEquals(45, xmlGregorianCalendar.getMinute());
    assertEquals(30, xmlGregorianCalendar.getSecond());
}

5. 总结

在这篇快速教程中,我们讨论了将字符串日期转换为XMLGregorianCalendar实例的不同方法。

如往常一样,本文的所有完整代码示例可以在GitHub上找到:GitHub链接


原始标题:Convert String Date to XMLGregorianCalendar in Java | Baeldung