How to format YearMonth and MonthDay depending on a Locale?

后端 未结 3 663
无人共我
无人共我 2020-12-03 19:06

Formatting a LocalDate in Java 8 using a specific Locale can be achieved like this:

DateTimeFormatter.ofLocalizedDate(FormatStyle.S         


        
3条回答
  •  遥遥无期
    2020-12-03 19:35

    Solution provided by gevorg is probably the simplest solution if you will use a limited list of Locale.

    If you want to make it work with any Locale I would suggest to get a locale pattern and then remove the parts you are not interested in, once you have this pattern you should remove the part you are not interested in and use the resulting pattern to create your own DateTimeFormatter.

    This is a full example of the idea explained above for MonthDay. In order to use it for YearMonth replace keep.add('d') with keep.add('y'). (and of course MonthDay with YearMonth)

    ArrayList locales = new ArrayList();
    locales.add(Locale.ENGLISH);
    locales.add(Locale.GERMAN);
    locales.add(new Locale("es", "ES"));
    locales.add(Locale.US);
    ArrayList styles = new ArrayList();
    styles.add(FormatStyle.SHORT);
    styles.add(FormatStyle.MEDIUM);
    styles.add(FormatStyle.LONG);
    styles.add(FormatStyle.FULL);
    ArrayList keep = new ArrayList();
    keep.add('d');
    keep.add('M');
    
    for (FormatStyle style : styles) {
        for (Locale myLocale : locales) {
            String myPattern = DateTimeFormatterBuilder.getLocalizedDateTimePattern(style, null, IsoChronology.INSTANCE, myLocale);
    
            boolean separator = false;
            boolean copy = true;
            String newPattern = "";
            for (char c : myPattern.toCharArray()) {
                if (c == '\'') {
                    separator = !separator;
                }
                if (!separator) {
                    if (Character.isAlphabetic(c)) {
                        if (keep.contains(c)) {
                            copy = true;
                        } else {
                            copy = false;
                        }
                    }
                }
                if (copy) {
                    newPattern = newPattern + c;
                }
            }
    
            char lastChar = newPattern.charAt(newPattern.length() - 1);
            while (!keep.contains(lastChar)) {
                if (lastChar == '\'') {
                    newPattern = newPattern.substring(0, newPattern.length() - 1);
                    newPattern = newPattern.substring(0, newPattern.lastIndexOf('\''));
                } else {
                    newPattern = newPattern.substring(0, newPattern.length() - 1);
                }
                lastChar = newPattern.charAt(newPattern.length() - 1);
            }
    
            System.out.println(DateTimeFormatter.ofPattern(newPattern, myLocale).format(YearMonth.now()));
        }
        System.out.println();
    }
    

    The output would be:

    6/30
    Jun 30
    June 30
    June 30
    
    30.06
    30.06
    30. Juni
    30. Juni
    
    30/06
    30-jun
    30 de junio
    30 de junio
    
    6/30
    Jun 30
    June 30
    June 30
    

    And for YearMonth:

    6/16
    Jun 2016
    June 2016
    June 2016
    
    06.16
    06.2016
    Juni 2016
    Juni 2016
    
    06/16
    jun-2016
    junio de 2016
    junio de 2016
    
    6/16
    Jun 2016
    June 2016
    June 2016
    

提交回复
热议问题