没有真正理想的转换,但我想提供几个选项。
java.time
首先,您应该使用 java.time(现代 Java 日期和时间 API)中的 LocalDate 来解析和保存您的日期。避免使用Date 和SimpleDateFormat,因为它们存在设计问题并且早已过时。后者尤其是出了名的麻烦。
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 指定的)。如果有人想知道,LocalDate 和 XMLGregorianCalendar 都以人类的方式计算月份,所以没有加或减 1。
通过公历转换
我只给你看这个选项,因为我以某种方式认为它是官方方式:将LocalDate转换为ZonedDateTime,然后转换为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);
我喜欢转换本身,因为我们既不需要使用字符串也不需要传递单个字段(注意以正确的顺序进行)。我不喜欢的是我们必须传递一天中的时间和时区偏移量,然后手动清除这些字段。