Непревзойденная дата с дополнительным номером в 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" )], это сработает.

Ответ 1

Как сказал Питер Лоури, Java видит '20160' как год. Вы можете решить свою проблему, изменив "201600101" на, например, 2016-00101 и реорганизовать ваш формат patter как

SimpleDateFormat format = new SimpleDateFormat("yyyy-'0'MMdd");

Это проанализирует вашу дату.

Ответ 2

Использование библиотеки, в которой вы можете использовать фиксированную ширину в четыре цифры за год, сделало бы трюк. Пример для 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.