Java 中有额外数字的无法解析的日期

Unparseable date with extra number in Java

这段代码有什么问题?我正在尝试解析年和月之间为 0 的日期格式。

import java.text.SimpleDateFormat;

class Main {
    public static void main(String[] args) {
        SimpleDateFormat format = new SimpleDateFormat("yyyy'0'MMdd");
        try {
            Date date = format.parse("201600101");
            System.out.println(date);
        } catch (Exception ex) {
            System.out.println(ex.getMessage());
        }
    }
}

这会输出无法解析的日期:“201600101”。如果我将“0”更改为数字以外的任何内容[例如'X' 和 format.parse("2016X0101")] 这会起作用。

正如 Peter Lawrey 所说,Java 将 '20160' 视为一年。您可以通过将 "201600101" 修改为例如 2016-00101 并将您的格式模式重构为

来解决您的问题
SimpleDateFormat format = new SimpleDateFormat("yyyy-'0'MMdd");

这将解析您的日期。

使用一个库,您可以在其中使用四位数的固定宽度来表示年份。 java.time-包在 Java-8 中的示例:

    String input = "201600101";

    DateTimeFormatter dtf =
        new DateTimeFormatterBuilder()
            .appendValue(ChronoField.YEAR, 4, 4, SignStyle.NEVER)
            .appendLiteral('0')
            .appendPattern("MMdd")
            .toFormatter();
    LocalDate date = LocalDate.parse(input, dtf);
    System.out.println(date); // 2016-01-01

这有很强的优势,不会被迫改变输入。更改格式化程序总是更好。不可否认,SimpleDateFormat.

是不可能的