并没有一个理想的转换方式,但我想提供几个选项。
java.time
首先,您应该使用java.time中的LocalDate
,它是现代Java日期和时间API,用于解析和保存日期。避免使用Date
和SimpleDateFormat
,因为它们存在设计问题,并且已经过时了。后者尤其令人头疼。
最初的回答:
没有最佳的转换方式,但建议使用现代Java日期和时间API中的LocalDate
类来解析和保存日期。不要使用已经过时的Date
和SimpleDateFormat
类,因为它们存在设计问题和缺陷。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年6月13日
将日期转换为字符串并解析回去对我来说感觉浪费,但正如我所说,这很容易,而且我认为结果符合预期。
逐个传递年、月和日
XMLGregorianCalendar xmlDate = DatatypeFactory.newInstance()
.newXMLGregorianCalendarDate(date.getYear(), date.getMonthValue(),
date.getDayOfMonth(), DatatypeConstants.FIELD_UNDEFINED);
结果与以前相同。我们需要明确表示我们不想要时区偏移量(这就是
DatatypeConstants.FIELD_UNDEFINED
的含义)。如果有人想知道,
LocalDate
和
XMLGregorianCalendar
都像人类一样计算月份,因此不需要加1或减1。
通过GregorianCalendar进行转换
我只向您展示此选项,因为我认为这是官方方式:将
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);
我喜欢转换本身,因为我们既不需要使用字符串,也不需要传递单个字段(注意以正确的顺序执行)。我不喜欢的是我们必须传递一个白天时间和时区偏移量,然后手动清除这些字段。
最初的回答:
我喜欢转换本身,因为它不需要使用字符串或传递单个字段(需要注意正确的顺序)。但我不喜欢的是,我们必须传递一个时间和时区偏移量,然后手动清除这些字段。