我试图将java.util.Date
转换为意大利语(dd / mm / yyyy)格式的XMLGregorianCalendar
。无论我如何尝试,输出始终会显示yyyy-mm-dd
。
GregorianCalendar cal = new GregorianCalendar(TimeZone.getTimeZone("Europe/Rome"));
XMLGregorianCalendar xmlDate = DatatypeFactory.newInstance().newXMLGregorianCalendarDate(cal.get(Calendar.YEAR),
cal.get(Calendar.MONTH)+1, cal.get(Calendar.DAY_OF_MONTH),
DatatypeConstants.FIELD_UNDEFINED);
System.out.println(xmlDate);
我是SOAP Web服务的使用者,并且date属性定义为XMLGregorianCalendar
。
请告知如何更改代码以获取格式为(dd / mm / yyyy)的输出。
答案 0 :(得分:2)
您不需要XMLGregorianCalender
。它不会,不能满足您的要求。相反,您需要一个LocalDate
和一个DateTimeFormatter
:
DateTimeFormatter italianDateFormatter
= DateTimeFormatter.ofLocalizedDate(FormatStyle.SHORT)
.withLocale(Locale.ITALIAN);
LocalDate date = LocalDate.now(ZoneId.of("Europe/Rome"));
String formattedDate = date.format(italianDateFormatter);
System.out.println(formattedDate);
今天我运行这段代码时,输出为:
21/01/19
与您要求的区别是两位数字年份19
。如果我们使用FormatStyle.SHORT
而不是FormatStyle.MEDIUM
,则得到四位数的年份,但是将月份表示为三个字母的缩写:
21-gen-2019
优点是代码非常适合于国际化:您只需要更改语言环境即可获得适用于其他语言和国家/地区的适当代码。如果您确实需要21/01/2019
(四位数的年份),请使用模式显式指定格式:
DateTimeFormatter italianDateFormatter
= DateTimeFormatter.ofPattern("dd/MM/uuuu");
21/01/2019
XMLGregorianCalendar
有什么问题?调用System.out.println(xmlDate)
时,就是在toString
上隐式调用XMLGregorianCalendar
。在没有时间和区域偏移的情况下,toString
始终会生成yyyy-MM-dd
格式,因此您无法更改它。另一方面,您可以在String
中使用任意格式。下一个障碍是,没有格式化程序可以直接格式化XMLGregorianCalendar
。首先,您需要转换为其他类型,例如ZonedDateTime
。由于您只想要日期,而不是时间和时区,因此从LocalDate
开始就更简单容易。尤其是对于那些在您之后阅读并维护您的代码的人。
您的问题提到java.util.Date
,您的代码也使用GregorianCalendar
。这两个类的设计都差强人意,并且已经过时,被现代Java日期和时间API java.time完全取代。因此,我建议您不要使用它们。
Oracle tutorial: Date Time解释了如何使用Java.time(现代Java日期和时间API)。