【问题标题】:How to capitalize the first letter of the three letters month name date in Java 8如何在Java 8中将三个字母月份名称日期的第一个字母大写
【发布时间】:2019-03-18 02:25:48
【问题描述】:

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

【问题讨论】:

  • 此输出中月份未大写的原因是月份名称在西班牙语中通常不大写:spanishdict.com/guide/capitalization-in-spanish
  • 很棒的链接,@ScottW!请允许我引用它:“西班牙语不大写:星期几、月份、语言、国籍、宗教、地名中的第一个单词”。

标签: java date-format date


【解决方案1】:

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

【讨论】:

  • 请不要教年轻人使用陈旧过时且臭名昭著的SimpleDateFormat类。至少不是第一选择。而且不是没有任何保留。今天我们在java.time, the modern Java date and time API 和它的DateTimeFormatter 中做得更好。这甚至是问题所要问的。所以我考虑偏离那个糟糕的建议。
  • @OleV.V.我的目的不是推广 simpleDateFormat。感谢您的建议,我们会牢记这一点,并会尽快更新我的答案。
【解决方案2】:

功能,而不是错误

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

您希望第一个字母为大写是不正确的。如果您坚持这个结果,您将需要硬编码解决方案,而不是依赖自动本地化功能。

【讨论】:

    【解决方案3】:

    这是令人沮丧的答案!我想你说和写西班牙语比我好,但我的理解是西班牙语——可能像世界上大多数语言一样——在月份名称中使用一个小的首字母。当然你写的是“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

    如果您不希望点表示缩写,请修改代码以删除它。

    链接:Months of the year in many different languages

    【讨论】:

      【解决方案4】:
      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();
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-08
        • 1970-01-01
        • 2013-01-29
        • 2017-07-12
        • 2018-07-08
        • 1970-01-01
        • 2011-04-23
        • 2015-02-11
        相关资源
        最近更新 更多