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