如何在Java 8中将三个字母月份名称日期的首字母大写

时间:2019-03-18 02:25:48

标签: java date date-format java-date

我有以下表示日期的字符串,例如“ 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"

4 个答案:

答案 0 :(得分:2)

功能,不是错误

在西班牙,西班牙语的正确本地化使用小写字母表示月份名称。

您对第一个字母大写的要求不正确。如果您坚持该结果,则需要对解决方案进行硬编码,而不是依赖于自动本地化功能。

答案 1 :(得分:2)

DateTimeFormatter根据语言环境规则使用月份名称和大小写。

在英语中,必须强制将月份的首字母大写,而西班牙语不是这种情况。对于西班牙语,必须按照RAE

将其设置为小写字母

您将必须使用类DateFormatSymbols来覆盖如下所示的月份名称,或者只需要通过编写一些代码将您的情况下dateInspanish第一个空格后的第一个字母的最终字符串转换为大写即可。

解决方案仅适用于Java7或更低版​​本。对于Java 8和更高版本,请查看@OleV.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 :(得分:0)

这是令人沮丧的答案!我想您会说和说西班牙语比我要好,但是我的理解是,西班牙语-就像世界上大多数语言一样-在月份名称中使用一个小的首字母。当然,您写的是“ Diciembre es un mesfrío”(12月是一个寒冷的月份;来自Google Translate),但是在“ 2013年25 dic”中间,您需要写一个小d。

无论如何,如果您指示Java产生错误的输出,则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”(非大写字母):2013年第25版。

如果您不想让圆点表示缩写,请修改代码也将其删除。

链接:Months of the year in many different languages

答案 3 :(得分:0)

dateString = "14/feb/2020";
        dateString = UtilsDate.capitalizeDate(dateString);

...

    public static String capitalizeDate(String dateString) {

    StringBuilder dateStringBuilder = new StringBuilder(dateString.toLowerCase());

    for (int i = 0; i < dateStringBuilder.length(); i++) {

        char c = dateStringBuilder.charAt(i);

        if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) {

            dateStringBuilder.setCharAt(i, Character.toUpperCase(dateStringBuilder.charAt(i)));

            break;
        }
    }

    return dateStringBuilder.toString();
}