立即格式化带有意大利日期格式(dd / mm / yyyy)的XMLGregorianCalendar

时间:2019-01-21 16:40:01

标签: java calendar date-formatting gregorian-calendar xmlgregoriancalendar

我试图将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)的输出。

1 个答案:

答案 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)。