Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Validation Java8日期验证-构建格式化程序_Validation_Date_Java 8 - Fatal编程技术网

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

我正在尝试建立一个基于。。。验证我的输入日期。我的逻辑要求以下格式有效

  • yyyy-MM-dd'HH:MM:ss.SSSS
  • yyyy MM dd HH:MM:ss.SSSS
  • 。。。由于上述格式中的微秒(SSSS)部分是可选的(或者),如果微秒的位数小于预期的6位数精度,比如说333而不是000333,我需要能够填充、验证和处理日期

    我正在通过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中有一个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”字面值)。唯一待定项是微秒的可变宽度。谢谢