Я пытаюсь построить DateTimeFormatter на основе https://stackoverflow.com/a/32964692/829542 ... для проверки даты ввода. Моя логика требует форматы ниже, чтобы быть действительнымПроверка даты на Java 8 - построение форматирования
- YYYY-MM-dd'T'HH: мм: ss.SSSSSS
- гггг-мм-дд чч: мм: ss.SSSSSS
... с частью микросекунды (SSSSSS) в вышеуказанном формате является необязательным (или), если количество микросхем меньше, чем ожидаемая точность в 6 цифр - например, 333 вместо 000333, мне нужно иметь возможность pad, подтвердите и обработайте дату.
Я работаю через DateTimeFormatter построить собственный форматировщик и прибыл в ниже -
DateTimeFormatter formatter = new DateTimeFormatterBuilder()
.appendPattern("yyyy")
.appendLiteral('-')
.appendValue(MONTH_OF_YEAR)
.appendLiteral('-')
.appendValue(DAY_OF_MONTH)
.appendLiteral('T')
.appendPattern(" HH:mm:ss")
.appendPattern("[.SSSSSS]")
.parseDefaulting(MICRO_OF_SECOND, MICRO_OF_SECOND.range().getMinimum())
.toFormatter();
Но это не разобрать - например, «2016-08-04T20: 43: 30», как действительная дата, а также я не уверен, как заполнять цифры. Я вижу, что в DateTimeFormatter есть методы пэдов, но я не уверен, как их использовать для получения желаемого результата. Я единственный, кто чувствует, что есть много, чтобы потреблять с Документами Java и следовать!
Любой советник оценен!
Update 1:
На основании ответа от @mtj, смог продолжить решение, чтобы покрыть большую часть проблемы. Единственный незавершенный предмет теперь состоит в том, чтобы сделать no. микросекунд, заданных в дате гибкой ширины от 0 до 6. В настоящий момент действительна только 0 и 6 цифр.
public class Test {
public static void main(String[] args)
{
System.out.println("Date 1 - 2016-08-04T20:43:30 = " + Test.isValid("2016-08-04T20:43:30")); // true
System.out.println("Date 2 - 2016-08-04 20:43:30 = " + Test.isValid("2016-08-04 23:43:30")); // true
System.out.println("Date 3 - 2016-08-04T20:43:30.123121 = " + Test.isValid("2016-08-04T20:43:30.123121")); // true
System.out.println("Date 4 - 2016-08-04 20:43:30.123131 = " + Test.isValid("2016-08-04 20:43:30.123131")); // true
System.out.println("Date 5 - 2016-08-04'T'20:43:30.123121 = " + Test.isValid("2016-08-04'T'20:43:30.123121")); // true
System.out.println("Date 6 - 2016-08-04'T' 20:43:30.123121 = " + Test.isValid("2016-08-04'T' 20:43:30.123121")); // false (as expected)
System.out.println("Date 7 - 2016-08-04T20:43:30.123 = " + Test.isValid("2016-08-04T20:43:30.123")); // false
System.out.println("Date 8 - 2016-08-04T20:43:30.123 = " + Test.isValid("2016-08-04 20:43:30.123")); // false
}
public static boolean isValid(String inputDate)
{
DateTimeFormatter charLiteralTFormat = getDateFormat()
.appendOptional(new DateTimeFormatterBuilder().appendLiteral("'").toFormatter())
.appendOptional(new DateTimeFormatterBuilder().appendLiteral('T').toFormatter())
.appendOptional(new DateTimeFormatterBuilder().appendLiteral("'").toFormatter())
.append(getTimeFormat().toFormatter())
.toFormatter();
DateTimeFormatter spaceBtwnDttmFormat = getDateFormat()
.appendOptional(new DateTimeFormatterBuilder().appendLiteral(' ').toFormatter())
.append(getTimeFormat().toFormatter())
.toFormatter();
DateTimeFormatter[] formatters = {
charLiteralTFormat, spaceBtwnDttmFormat};
for(DateTimeFormatter formatter : formatters) {
try {
LocalDate.parse(inputDate, formatter);
return true;
} catch (DateTimeParseException e) {
//System.out.println(" Invalid Date ... ");
}
}
return false;
}
public static DateTimeFormatterBuilder getDateFormat(){
DateTimeFormatterBuilder baseFormat = new DateTimeFormatterBuilder()
.appendPattern("yyyy")
.appendLiteral('-')
.appendValue(MONTH_OF_YEAR)
.appendLiteral('-')
.appendValue(DAY_OF_MONTH);
return baseFormat;
}
public static DateTimeFormatterBuilder getTimeFormat() {
DateTimeFormatterBuilder timeFormat = new DateTimeFormatterBuilder()
.appendPattern("HH:mm:ss")
.appendOptional(new DateTimeFormatterBuilder().appendLiteral('.').toFormatter())
.appendOptional(new DateTimeFormatterBuilder().appendValue(ChronoField.MICRO_OF_SECOND,6).toFormatter());
return timeFormat;
}
}
Выход
// Output -
// Validation going as expected
Date 1 - 2016-08-04T20:43:30 = true
Date 2 - 2016-08-04 20:43:30 = true
Date 3 - 2016-08-04T20:43:30.123121 = true
Date 4 - 2016-08-04 20:43:30.123131 = true
Date 5 - 2016-08-04'T'20:43:30.123121 = true
Date 6 - 2016-08-04'T' 20:43:30.123121 = false
// Output -
// Validation NOT going as expected
Date 7 - 2016-08-04T20:43:30.123 = false
Date 8 - 2016-08-04T20:43:30.123 = false
является формат # 1 «YYYY-MM -dd'T'HH: mm: ss.SSSSSS "или" yyyy-MM-ddTHH: mm: ss.SSSSSS "? Ваш пример не соответствует формату # 1 или # 2. –