我有以下表示日期的字符串,例如“ 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"
答案 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版。
如果您不想让圆点表示缩写,请修改代码也将其删除。
答案 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();
}