Validation Java8日期验证-构建格式化程序
我正在尝试建立一个基于。。。验证我的输入日期。我的逻辑要求以下格式有效Validation Java8日期验证-构建格式化程序,validation,date,java-8,Validation,Date,Java 8,我正在尝试建立一个基于。。。验证我的输入日期。我的逻辑要求以下格式有效 yyyy-MM-dd'HH:MM:ss.SSSS yyyy MM dd HH:MM:ss.SSSS 。。。由于上述格式中的微秒(SSSS)部分是可选的(或者),如果微秒的位数小于预期的6位数精度,比如说333而不是000333,我需要能够填充、验证和处理日期 我正在通过DateTimeFormatter构建一个自定义格式化程序,并得出以下结论- DateTimeFormatter formatter = new DateTi
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中有一个pad方法可用,但我不确定如何使用它们来获得所需的结果。我是不是唯一一个觉得Java文档和后续文档有很多东西需要消耗的人
任何专家建议都将不胜感激
更新1:
根据@mtj的回答,我们能够扩展解决方案以覆盖大部分问题。现在唯一的未决项目是将日期中指定的微秒数设置为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
您所发布的示例和输入的问题是一个小时前的空白。删除这个,它就会工作
但是请注意,这不会解析您需要的两种模式 我想,以下内容将更接近您的要求,即使它将接受“T”和blank的组合,这应该是非法的: DateTimeFormatter formatter = new DateTimeFormatterBuilder()
.appendPattern("yyyy")
.appendLiteral('-')
.appendValue(ChronoField.MONTH_OF_YEAR)
.appendLiteral('-')
.appendValue(ChronoField.DAY_OF_MONTH)
.appendOptional(new DateTimeFormatterBuilder().appendLiteral('T').toFormatter())
.appendOptional(new DateTimeFormatterBuilder().appendLiteral(' ').toFormatter())
.appendPattern("HH:mm:ss")
.appendOptional(new DateTimeFormatterBuilder().appendPattern(".SSSSSS").toFormatter())
.toFormatter();
格式是#1“yyy-MM-dd'T'HH:MM:ss.SSSSSS”还是“yyy-MM-ddth:MM:ss.ssss”?您的示例与格式#1或#2不匹配。根据您的解决方案更新了答案,该解决方案解决了我的大部分需求(包括没有可选的空格和“t”字面值)。唯一待定项是微秒的可变宽度。谢谢