Java在yyyyMMddHHmmss中验证日期

时间:2015-11-13 02:55:41

标签: java java-7 java.util.date

我想在java中验证给定的日期格式为yyyyMMddHHmmss。

条件:

  1. 它应符合格式yyyyMMddHHmmss。

  2. 它应验证当前日期。

  3. 它应该验证与当前小时相差+3小时或-3小时的小时数。

  4. 如果满足所有三个条件,则Java方法应返回true。

    我当前的代码只验证yyyyMMddHHmmss格式。

    我当前的代码

    public class SO31132861 {
    public static void main(String[] args) {
        SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
        df.setLenient(false);
    
        System.out.println(tryParse(df, "20160630231110"));
        System.out.println(tryParse(df, "20150228231100"));
        System.out.println(tryParse(df, "20160229231100"));
    
        System.out.println(tryParse(df, "21000229231100")); // 29th Feb on non-leap year 2100
        System.out.println(tryParse(df, "20160631231110")); // 31st Jun invalid day
        System.out.println(tryParse(df, "20160229231160")); // Second > 59
        System.out.println(tryParse(df, "20150229231100")); // 29th Feb on non-leap year 2015
        System.out.println(tryParse(df, "20150228241100")); // Hour > 23
    
    }
    
    private static Boolean tryParse(DateFormat df, String s) {
        Boolean valid=false;
        try {
            Date d= df.parse(s);
            valid=true;
        } catch (ParseException e) {
             valid=false;
        }
        return valid;
    }
    }
    

1 个答案:

答案 0 :(得分:1)

使用另外两个日期,提前三小时和三小时后进行比较。然后使用compareTo()确保您要解析的日期在这两个边界之间。

你真的不应该在你的班级名字中加上数字,但这是一个与答案无关的风格问题。

public class SO31132861 {
public static void main(String[] args) {
    SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
    df.setLenient(false);

    System.out.println(tryParse(df, "20160630231110"));
    System.out.println(tryParse(df, "20150228231100"));
    System.out.println(tryParse(df, "20160229231100"));

    System.out.println(tryParse(df, "21000229231100")); // 29th Feb on non-leap year 2100
    System.out.println(tryParse(df, "20160631231110")); // 31st Jun invalid day
    System.out.println(tryParse(df, "20160229231160")); // Second > 59
    System.out.println(tryParse(df, "20150229231100")); // 29th Feb on non-leap year 2015
    System.out.println(tryParse(df, "20150228241100")); // Hour > 23

}

private static Boolean tryParse(DateFormat df, String s) {
    Boolean valid=false;
    try {
        Date threeHoursBefore = new Date();
        threeHoursBefore.setTime(System.currentTimeMillis() - (3*60*60*1000));

        Date threeHoursAfter = new Date();
        threeHoursAfter.setTime(System.currentTimeMillis() + (3*60*60*1000));

        Date dateToParse= df.parse(s);

        valid=dateToParse.compareTo(threeHoursBefore) > 0 && dateToParse.compareTo(threeHoursAfter) < 0;
    } catch (ParseException e) {
         valid=false;
    }
    return valid;
}
}