Java在yyyyMMddHHmmss中validation日期

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

条件:

  1. 它应该符合格式yyyyMMddHHmmss。

  2. 它应该validation当前日期。

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

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

我当前的代码只validationyyyyMMddHHmmss格式。

我目前的代码

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; } } 

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

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

 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; } }