簡體   English   中英

如何在Java 8中將三個字母的月份名稱日期的第一個字母大寫

[英]How to capitalize the first letter of the three letters month name date in Java 8

我有以下字符串表示像“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"

DateTimeFormatter 根據區域設置規則使用月份名稱和大小寫。

在英語中,必須將月份的第一個字母大寫,而西班牙語則不然。 對於西班牙語,必須按照RAE 使用小寫字母

您將必須使用類 DateFormatSymbols 來覆蓋如下所示的月份名稱,或者只需通過編寫一些代碼將您的案例中的最后一個字符串dateInspanish第一個空格后的第一個字母轉換為大寫。

解決方案僅適用於 Java7 或更低版本。 對於 Java 8 及更高版本,請查看 @Ole VV 的答案

        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);

功能,而不是錯誤

西班牙的西班牙語正確本地化使用小寫字母表示月份名稱。

您希望第一個字母大寫是不正確的。 如果您堅持該結果,您將需要對解決方案進行硬編碼,而不是依賴自動本地化功能。

這是氣餒的答案! 我想你說和寫西班牙語的能力比我好,但我的理解是西班牙語——可能像世界上的大多數語言一樣——在月份名稱中使用一個小的首字母。 當然你寫“Diciembre es un mes frío”(十二月是一個寒冷的月份;來自谷歌翻譯),但在“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

如果您不希望點表示縮寫,請修改代碼以將其刪除。

鏈接:許多不同語言的一年中的月份

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();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM