[英]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.