0

我正在尝试立即将 a 转换java.util.DateXMLGregorianCalendar意大利语格式(dd/mm/yyyy)。无论我尝试什么输出总是打印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 服务的消费者,日期属性定义为XMLGregorianCalendar.

请告知如何更改代码以获取格式为(dd/mm/yyyy)的输出。

4

1 回答 1

2

你不需要一个XMLGregorianCalender. 它不会,不能给你你所要求的。相反,您需要 aLocalDate和 a 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 根 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 教程:日期时间解释如何使用 java.time,现代 Java 日期和时间 API。

于 2019-01-21T18:55:32.727 回答