使用正则表达式校验时间,精确到秒,包括年月日时分秒,14位格式精确校验,正则表达式精确校验时间

title :使用正则表达式校验时间,精确到秒,包括年月日时分秒,14位格式精确校验,正则表达式精确校验时间

今天做项目的时候遇到了校验日期的需求;
要求:精确校验14位的时间格式:yyyyMMddHHmmss,e.g.:20161213232255

要求时间绝对存在,举几个不存在的例子.1月32号,2月30日,24时,4点60分,等等。

说白了就是时间绝对存在而且考虑到平年2月28天,闰年2月29天等等。


为了综合考虑各种格式的时间,我做了以下精确分解,综合考虑:


part_1:时间格式:yyyyMMddHHmmss.例如:20161213232255

正则表达式为:

String timeRegex = "^((([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})(((0[13578]|1[02])(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)(0[1-9]|[12][0-9]|30))|(02(0[1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))0229))([0-1]?[0-9]|2[0-3])([0-5][0-9])([0-5][0-9])$";

测试代码:

public void test() {
		// 不带‘-’或‘:’或‘ ’
		// 不能带杠,冒号,空格,而且必须14位:e.g : 20161213164858是合法的;
		// 这个是超级精确的校验
		String timeRegex = "^((([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})(((0[13578]|1[02])(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)(0[1-9]|[12][0-9]|30))|(02(0[1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))0229))([0-1]?[0-9]|2[0-3])([0-5][0-9])([0-5][0-9])$";
		boolean b_2 = Pattern.matches(timeRegex, "20200229164859");
		System.out.println("timeRex : mathcesl : " + b_2);
	}


part_2:精确到日即可,即年月日,格式:yyyyMMdd,例如:20161213

正则表达式为:

String yyyyMMdd_Regex_2 = "^((([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})(((0[13578]|1[02])(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)(0[1-9]|[12][0-9]|30))|(02(0[1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))0229))$";

测试代码:

public static void test_4() {
		String yyyyMMdd_Regex_2 = "^((([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})(((0[13578]|1[02])(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)(0[1-9]|[12][0-9]|30))|(02(0[1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))0229))$";
		boolean b_3 = Pattern.matches(yyyyMMdd_Regex_2, "20200228");
		System.out.println("b_3 : " + b_3);

	}

part_3:精确到日即可,即年月日,格式:yyyy-MM-dd,例如:2016-12-13

正则表达式为:

String timeRegex_2 = "^((([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})-(((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)-(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))-02-29))$";

测试代码:

public static void test_5() {
		String timeRegex_2 = "^((([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})-(((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)-(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))-02-29))$";
		boolean b_3 = Pattern.matches(timeRegex_2, "2020-02-29");
		System.out.println("b_3 : " + b_3);

	}

part_4:校验时分秒:格式:HHmmss

正则表达式为:

String timeRegex_2 = "([0-1]?[0-9]|2[0-3])([0-5][0-9])([0-5][0-9])$";

测试代码:

public static void test_6() {
		String timeRegex_2 = "([0-1]?[0-9]|2[0-3])([0-5][0-9])([0-5][0-9])$";
		boolean b_3 = Pattern.matches(timeRegex_2, "230059");
		System.out.println("b_3 : " + b_3);
	}

part_5:校验时分秒:格式:HH-mm-ss

正则表达式为:

String timeRegex_2 = "([0-1]?[0-9]|2[0-3])-([0-5][0-9])-([0-5][0-9])$";

测试代码:

public static void test_7() {
		String timeRegex_2 = "([0-1]?[0-9]|2[0-3])-([0-5][0-9])-([0-5][0-9])$";
		boolean b_3 = Pattern.matches(timeRegex_2, "23-00-55");
		System.out.println("b_3 : " + b_3);
	}

part_6;还有 一种情况有可能大家会用到:yyyy-MM-dd HH:mm:ss(日期和时间之间有一个或多个空格)

正则表达式为:

String timeRegex = "^((([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})-(((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)-(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))-02-29))\\s+([0-1]?[0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])$";

测试代码:

public static void test_8() {
		String timeRegex = "^((([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})-(((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)-(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))-02-29))\\s+([0-1]?[0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])$";

		boolean b_2 = Pattern.matches(timeRegex, "2020-02-29 23:48:59");
		System.out.println("timeRex : mathcesl : " + b_2);
	}

最后:我把自己测试的整个类粘贴过来,因为有些哥们可能还有别的需求需要被满足;那结合这些自己再研究一下吧:

package cn.mike.test_1213;

import java.util.regex.Pattern;

public class Check_F801_Datagram {

	public static void main(String[] args) {
		// test();
		// test_2();
		// test_3();
		// test_4();
		// test_5();
		// test_6();
		// test_7();
		test_8();
	}

	public static void test() {
		// 不带‘-’或‘:’或‘ ’
		// 不能带杠,冒号,空格,而且必须14位:e.g : 20161213164858是合法的;
		// 这个是超级精确的校验
		String timeRegex = "^((([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})(((0[13578]|1[02])(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)(0[1-9]|[12][0-9]|30))|(02(0[1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))0229))([0-1]?[0-9]|2[0-3])([0-5][0-9])([0-5][0-9])$";
		boolean b_2 = Pattern.matches(timeRegex, "20200229164859");
		System.out.println("timeRex : mathcesl : " + b_2);
	}

	public static void test_2() {
		String timeRegex = "^((([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})======(((0[13578]|1[02])===(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)===(0[1-9]|[12][0-9]|30))|(02===(0[1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))======02===29))======([0-1]?[0-9]|2[0-3])======([0-5][0-9])======([0-5][0-9])$";

		boolean b_2 = Pattern.matches(timeRegex,
				"2020======02===28======16======48======58");
		System.out.println("timeRex : mathcesl : " + b_2);

	}

	public static void test_3() {

		String yyyyMMdd_Regex = "^((([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})======(((0[13578]|1[02])===(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)===(0[1-9]|[12][0-9]|30))|(02===(0[1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))======02===29))$";
		boolean b_2 = Pattern.matches(yyyyMMdd_Regex, "2020======02===28");
		System.out.println("timeRex : mathcesl : " + b_2);

		String yyyyMMdd_Regex_2 = "^((([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})(((0[13578]|1[02])(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)(0[1-9]|[12][0-9]|30))|(02(0[1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))0229))$";
		boolean b_3 = Pattern.matches(yyyyMMdd_Regex_2, "20200228");
		System.out.println("b_3 : " + b_3);

	}

	// part_2:精确到日即可,即年月日,格式:yyyyMMdd,例如:20161213
	public static void test_4() {
		String yyyyMMdd_Regex_2 = "^((([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})(((0[13578]|1[02])(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)(0[1-9]|[12][0-9]|30))|(02(0[1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))0229))$";
		boolean b_3 = Pattern.matches(yyyyMMdd_Regex_2, "20200228");
		System.out.println("b_3 : " + b_3);

	}

	// part_3:精确到日即可,即年月日,格式:yyyy-MM-dd,例如:2016-12-13
	public static void test_5() {
		String timeRegex_2 = "^((([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})-(((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)-(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))-02-29))$";
		boolean b_3 = Pattern.matches(timeRegex_2, "2020-02-29");
		System.out.println("b_3 : " + b_3);

	}

	// part_4:校验时分秒:格式:HHmmss
	public static void test_6() {
		String timeRegex_2 = "([0-1]?[0-9]|2[0-3])([0-5][0-9])([0-5][0-9])$";
		boolean b_3 = Pattern.matches(timeRegex_2, "230059");
		System.out.println("b_3 : " + b_3);
	}

	// part_4:校验时分秒:格式:HH-mm-ss
	public static void test_7() {
		String timeRegex_2 = "([0-1]?[0-9]|2[0-3])-([0-5][0-9])-([0-5][0-9])$";
		boolean b_3 = Pattern.matches(timeRegex_2, "23-00-55");
		System.out.println("b_3 : " + b_3);
	}

	// part_6;还有 一种情况有可能大家会用到:yyyy-MM-dd HH:mm:ss
	// (日期和时间之间有一个或多个空格)//
	public static void test_8() {
		String timeRegex = "^((([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})-(((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)-(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))-02-29))\\s+([0-1]?[0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])$";

		boolean b_2 = Pattern.matches(timeRegex, "2020-02-29 23:48:59");
		System.out.println("timeRex : mathcesl : " + b_2);
	}
}



  • 12
    点赞
  • 62
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值