Как использовать заглавную букву из трех букв в названии месяца в Java 8 - PullRequest
1 голос
/ 18 марта 2019

У меня есть следующая строка, которая представляет такую ​​дату, как «20190123», и я хочу преобразовать ее в этот формат «25 Dic 2019», название месяца должно быть на испанском, а первая буква должна быть в верхнем регистре. есть это

    String input = "12252013";
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern( "MMddyyyy" );
    LocalDate localDate = LocalDate.parse( input , formatter );
    Locale spanishLocale=new Locale("es", "ES");
    String dateInSpanish=localDate.format(DateTimeFormatter.ofPattern("dd MMM, yyyy",spanishLocale));
    System.out.println("'2016-01-01' in Spanish: "+dateInSpanish);

это печатает "25 dic, 2013" Я хочу, чтобы это было так "25 Dic 2019"

Ответы [ 3 ]

2 голосов
/ 18 марта 2019

DateTimeFormatter использует названия месяцев и заглавные буквы в соответствии с правилами локали.

На английском языке обязательно иметь заглавную первую букву месяца, что не относится к испанскому языку. Для испанского языка обязательно иметь маленькие буквы в соответствии с RAE

Вам нужно будет использовать класс DateFormatSymbols для переопределения названий месяцев, как показано ниже, ИЛИ просто преобразовать окончательную строку в вашем случае dateInspanish первые буквы после первого пробела в прописные буквы, написав некоторый код.

Решение применимо только к Java7 или ниже. Для Java 8 и выше проверьте @Ole V.V. ответ

        String input = "12252013";
        Locale spanishLocale=new Locale("es", "ES");

        DateFormatSymbols sym = DateFormatSymbols.getInstance(spanishLocale);
        sym.setMonths(new String[]{"Enero","Febrero","Marzo","Abril","Mayo","Junio","Julio","Agosto","Septiembre","Octubre","Noviembre","Diciembre" });
        sym.setShortMonths(new String[]{"Ene","Feb","Mar","Abr","May","Jun","Jul","Ago","Sep","Oct","Nov","Dic" });

        DateFormat df = DateFormat.getDateInstance(DateFormat.MEDIUM, spanishLocale);
        SimpleDateFormat sdf = (SimpleDateFormat) df;
        sdf.setDateFormatSymbols(sym);

        Date inputDate = new SimpleDateFormat("MMddyyyy").parse(input);

        String dateInSpanish = sdf.format(inputDate);
        System.out.println(dateInSpanish);
2 голосов
/ 18 марта 2019

Функция, а не ошибка

Правильная локализация испанского языка в Испании использует строчную букву для названия месяца.

Ваше желание, чтобы первая буква была заглавной, неверна.Если вы настаиваете на этом результате, вам нужно будет жестко кодировать решение, а не полагаться на функцию автоматической локализации.

0 голосов
/ 19 марта 2019

Это обескураженный ответ!Я полагаю, что вы говорите и пишете по-испански лучше, чем я, но, насколько я понимаю, испанский - как и, возможно, большинство языков мира, - использует маленькую первую букву в названиях месяцев.Конечно, вы пишете «Diciembre es un mes frío» (декабрь - холодный месяц; от Google Translate), но в середине «25 dic, 2013» вам нужно маленькое d.

В любом случае,Java, конечно, может выдавать неправильный вывод, если вы дадите команду на вывод неправильного вывода.Так что, если ваши пользователи настаивают:

    Locale spanishLocale = new Locale("es", "ES");
    Map<Long, String> monthAbbreviations = Stream.of(Month.values())
            .collect(Collectors.toMap(m -> Long.valueOf(m.getValue()), 
                    m -> {
                        String abbrev = m.getDisplayName(TextStyle.SHORT, spanishLocale);
                        // Capitalize first letter against Spanish usage
                        return abbrev.substring(0, 1).toUpperCase(spanishLocale)
                                + abbrev.substring(1);
                    }));
    DateTimeFormatter formatter = new DateTimeFormatterBuilder()
            .appendPattern("dd ")
            .appendText(ChronoField.MONTH_OF_YEAR, monthAbbreviations)
            .appendPattern(", yyyy")
            .toFormatter(spanishLocale);

    LocalDate localDate = LocalDate.of(2013, Month.DECEMBER, 25);
    String dateInSpanish=localDate.format(formatter);
    System.out.println("'2013-12-25' in Spanish with non-current capitalization: " + dateInSpanish);

'2013-12-25' на испанском языке с не текущей капитализацией: 25 Dic., 2013

Если вы неЕсли вам не нужна точка, обозначающая аббревиатуру, измените код, чтобы удалить ее.

Ссылка: Месяцы года на разных языках

...