Java里面效验日期的正则表达式

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java里面效验日期的正则表达式相关的知识,希望对你有一定的参考价值。

要具体的 年月日 时分秒,因为这些数据是用户输入的,用户输入随时可能超过正常的格式,比如用户输入个20131936,月份超了,天数也超了,所以我在验证的时候我需要把这个数据给打回去,求个正则表达式 ,谢谢,在线等

 public static void main(String[] args)   
       
        String checkValue = "20000431112230";  
String year = checkValue.substring(0, 4); // 获取年份
String month = checkValue.substring(4, 6); // 获取月份
        Boolean isLeap = leapYear(Integer.parseInt(year)); // 判断闰年
        System.out.println(isLeap);
        StringBuffer eL= new StringBuffer();
        String longMonth = "01030507081012"; // 31天的月份
        String fix = "([2][0-3]|[0-1][0-9]|[1-9])[0-5][0-9]([0-5][0-9]|[6][0])";
        
        
        if(isLeap && month.equals("02"))  // 针对2月份的情况 【闰年】
         eL.append("\\\\d4([1][0-2]|[0][0-9])([2][0-1]|[1-2][0-9]|[0][1-9]|[1-9])"+fix);
        else if(!isLeap && month.equals("02")) // 针对2月份的情况 【非闰年】
         eL.append("\\\\d4([1][0-2]|[0][0-9])([2][0-1]|[1-2][0-8]|[0][1-9]|[1-9])"+fix);
        else if(longMonth.contains(month)) // 31天月份
         eL.append("\\\\d4([1][0-2]|[0][0-9])([3][0-1]|[1-2][0-9]|[0][1-9]|[1-9])"+fix);
        else // 30天月份
         eL.append("\\\\d4([1][0-2]|[0][0-9])([3][0]|[1-2][0-9]|[0][1-9]|[1-9])"+fix);
        
        Pattern p = Pattern.compile(eL.toString());    
        Matcher m = p.matcher(checkValue);    
        boolean flag = m.matches();   
        if(flag )   
                 
            System.out.println("格式正确");   
           
        else  
           
            System.out.println("格式错误");   
           
  
     
public static boolean leapYear(int year) 
Boolean isLeap = false;
if (((year % 100 == 0) && (year % 400 == 0))
|| ((year % 100 != 0) && (year % 4 == 0)))
isLeap = true;
return isLeap;

参考技术A 比如 2013-11-01 12:12:12
/^(\d4)-(0\d1|1[0-2])-(0\d1|[12]\d1|3[01]) (0\d1|1\d1|2[0-3]):[0-5]\d1:([0-5]\d1)$/
20131101 121212
/^(\d4)(0\d1|1[0-2])(0\d1|[12]\d1|3[01]) (0\d1|1\d1|2[0-3])[0-5]\d1([0-5]\d1)$/
这个是可以的,我测了的。。。追问

麻烦您能帮忙解释一下吗,有点模糊。放上去可以用也得知道原理是把 ,麻烦了

追答

/^(\d4)-(0\d1|1[0-2])-(0\d1|[12]\d1|3[01]) (0\d1|1\d1|2[0-3]):[0-5]\d1:([0-5]\d1)$/
就比如这个吧,空格前面验证年份,\d表示数字字符匹配相当于[0-9]
第一个括号(\d4)表示匹配四个数字表示年份,
第二个括号(0\d1|1[0-2])表示0开头后面匹配一位数字或者1开头匹配0-2之间的数字
后面都差不多这个意思没有特别复杂的。。。

个人认为还是用
/^(\d4)-(0\d1|1[0-2])-(0\d1|[12]\d1|3[01]) (0\d1|1\d1|2[0-3]):[0-5]\d1:([0-5]\d1)$/
这种比较好
如果把中间的-去掉了的话
前面就是8位数字,有很多数据都判断不了

这样比较日期吧 反正你在后台获取这个日期是String类型的
String a="2013-11-04 15:40:12";//从前台传过来的日期
Date date = new Date(); //当前系统日期
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
Date t = format.parse(a);
boolean flag = t.before(date);
if(flag) System.out.print("早于今天");
else System.out.print("晚于今天");

追问

这个代码复杂度我先不说,我现在需要的是正则表达式的,你能帮帮忙,看你的能不能跑的通,你写的那个 为什么不能赋值给String 类型,编译都不过,等着要了 ,麻烦了

这个代码复杂度我先不说,我现在需要的是正则表达式的,你能帮帮忙,看你的能不能跑的通,你写的那个 为什么不能赋值给String 类型,编译都不过,等着要了 ,麻烦了

追答

你在前台通过正则表达式验证数据,如果是规范数据的话,你是不是要传到后台?在后台是通过request.getParamete("")方法来获得数据吗?是String类型的吗?还有你要比较的数据不是跟系统时间比较的吗?如果不是的话也可以先通过SimpleDateFormat转换成Date类型是java.util.Date类型。再进行比较,上面那种方法是可以通过的,你也可以直接在main方法里面测试

追问

String h ="/^(\d4)-(0\d1|1[0-2])-(0\d1|[12]\d1|3[01]) (0\d1|1\d1|2[0-3]):[0-5]\d1:([0-5]\d1)$/"; 这是你传给我的

本回答被提问者采纳
参考技术B 网上一搜一大箩.

以上是关于Java里面效验日期的正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

Java_正则表达式&时间日期

可变日期长度的 Java 正则表达式模式

python正则表达式匹配中文日期时间

python正则表达式匹配中文日期时间

Java正则表达式匹配用点分隔的日期

Java中使用正则检查有效日期