代码之家  ›  专栏  ›  技术社区  ›  Ferry Kranenburg

Java 8日期时间解析,可选2-4年组件[重复]

  •  0
  • Ferry Kranenburg  · 技术社区  · 7 年前

    我想从各种日期字符串解析LocalDate对象。所有字符串的格式都已为dd-MM-yy或dd-MM-yyy。在第一种情况下,基准年应提前19而不是20。

            public static LocalDate parseDateString(String date) {
                DateTimeFormatter optionalFullYearParser = java.time.format.DateTimeFormatter.ofPattern("[dd-MM-yy][dd-MM-yyyy]");
                DateTimeFormatter parser = new DateTimeFormatterBuilder()
                        .appendOptional(optionalFullYearParser)
                        .appendValueReduced(ChronoField.YEAR, 2, 4, 1900)
                        .toFormatter(new Locale ("nl","NL"));
    
                return java.time.LocalDate.parse(date,parser);
            }
    
            System.out.println(parseDateString("11-10-56").toString());
            System.out.println(parseDateString("11-10-1956").toString());
            System.out.println(parseDateString("08-05-51").toString());
    

    当我运行此代码时,它会引发一个异常:

    java.time.format.DateTimeParseException:无法在索引8处分析文本“11-10-56”

    任何帮助都将不胜感激!

    1 回复  |  直到 7 年前
        1
  •  2
  •   NiVeR    7 年前

    不需要两个格式化程序对象来执行此操作,并且在使用时不应在模式文本中包含年份部分 appendValueReduced

    public static LocalDate parseDateString(String date) {
        DateTimeFormatter parser = new DateTimeFormatterBuilder()
                .appendPattern("dd-MM-")
                .appendValueReduced(ChronoField.YEAR, 2, 4, 1900)
                .toFormatter(Locale.forLanguageTag("nl-NL"));
        return java.time.LocalDate.parse(date, parser);
    }
    

    试验

    System.out.println(parseDateString("11-10-56").toString());
    System.out.println(parseDateString("11-10-1956").toString());
    System.out.println(parseDateString("08-05-51").toString());
    

    输出

    1956-10-11
    1956-10-11
    1951-05-08