判断日期格式 ---JAVA
- 格式:doc
- 大小:46.00 KB
- 文档页数:6
java validate 基本用法(一)Java Validate基本Java的验证(Validate)是一种常见的编程技术,用于验证输入数据的有效性。
在Java中,验证通常用于确保用户输入的数据符合预期的格式和规则,以保护应用程序的安全性和正确性。
本文将介绍一些Java验证的基本用法。
1. 使用正则表达式验证字符串正则表达式是一种强大的工具,可以用来验证和提取字符串中的模式。
在Java中,可以使用matches()方法来判断一个字符串是否符合指定的正则表达式模式。
以下是一个示例,用于验证一个字符串是否只包含数字:String pattern = "\\d+"; // 正则表达式模式,表示一个或多个数字String input = "12345"; // 待验证的字符串if ((pattern)) {("字符串符合指定的正则表达式模式");} else {("字符串不符合指定的正则表达式模式");}在上述示例中,\\d+表示一个或多个数字的正则表达式模式。
如果输入的字符串符合该模式,则输出”字符串符合指定的正则表达式模式”;否则输出”字符串不符合指定的正则表达式模式”。
2. 使用Java标准库验证日期Java的标准库提供了SimpleDateFormat类,可以用于验证和格式化日期。
通过指定日期的格式,可以判断一个字符串是否表示一个有效的日期。
以下是一个示例,用于验证一个字符串是否表示一个有效的日期:String dateFormat = "yyyy-MM-dd"; // 日期格式,例如:String input = ""; // 待验证的日期字符串SimpleDateFormat sdf = new SimpleDateFormat(dateFormat); (false); // 关闭宽松模式,禁止接受非法日期try {(input);("字符串表示一个有效的日期");} catch (ParseException e) {("字符串不表示一个有效的日期");}在上述示例中,yyyy-MM-dd表示日期的格式,例如:。
java对传入的中excel格式校验的方法【实用版5篇】目录(篇1)1.Java 对传入的中 Excel 格式校验的方法概述2.Java 中用于处理 Excel 格式校验的库介绍3.Java 中实现 Excel 格式校验的具体方法4.Java 中 Excel 格式校验的注意事项5.总结正文(篇1)一、Java 对传入的中 Excel 格式校验的方法概述在 Java 开发过程中,常常需要对用户上传的 Excel 文件进行格式校验,以确保数据的准确性和完整性。
对于这种情况,Java 提供了一些方法来对传入的中 Excel 格式进行校验。
本文将介绍这些方法,并给出具体的实现示例。
二、Java 中用于处理 Excel 格式校验的库介绍在 Java 中,有很多库可以用于处理 Excel 格式校验,其中比较常用的有 Apache POI 和 OpenCSV。
下面对这两个库进行简要介绍:1.Apache POIApache POI 是一个用于处理 Microsoft Office 文档的 Java 库,包括 Excel、Word 和 PowerPoint 等。
它提供了丰富的 API,可以方便地对 Excel 文件进行读取、写入和格式校验等操作。
2.OpenCSVOpenCSV 是一个纯 Java 编写的库,用于处理 CSV 和 Excel 文件。
它支持多种数据类型,包括字符、数字、日期和布尔值等。
同时,OpenCSV还提供了一些高级功能,如自动类型转换和内联注释等。
三、Java 中实现 Excel 格式校验的具体方法下面以 Apache POI 库为例,介绍如何在 Java 中实现 Excel 格式校验:1.首先,需要导入 Apache POI 库。
在 Maven 项目中,可以在pom.xml 文件中添加以下依赖:```xml<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>5.0.0</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>5.0.0</version></dependency>```2.创建一个方法,用于检查 Excel 文件是否符合预期格式:```javaimport ermodel.*;import ermodel.XSSFWorkbook;import java.io.FileInputStream;import java.io.IOException;import java.util.Iterator;public boolean checkExcelFormat(String filePath) throws IOException {FileInputStream fis = new FileInputStream(filePath);Workbook workbook = new XSSFWorkbook(fis);Sheet sheet = workbook.getSheetAt(0);Iterator<Row> rowIterator = sheet.iterator();while (rowIterator.hasNext()) {Row row = rowIterator.next();Iterator<Cell> cellIterator = row.cellIterator();while (cellIterator.hasNext()) {Cell cell = cellIterator.next();String cellValue = getCellValueAsString(cell);if (cellValue == null ||cellValue.trim().isEmpty()) {return false;}}}return true;}private String getCellValueAsString(Cell cell) {if (cell == null) {return null;}CellType cellType = cell.getCellType();switch (cellType) {case STRING:return cell.getStringCellValue();case NUMERIC:returnString.valueOf(cell.getNumericCellValue());case BOOLEAN:returnString.valueOf(cell.getBooleanCellValue());case FORMULA:return cell.getCellFormula();default:return null;}}```四、Java 中 Excel 格式校验的注意事项在进行 Excel 格式校验时,需要注意以下几点:1.检查文件是否为空或文件格式是否正确。
java校验逻辑
在 Java 中,我们可以使用各种方式来进行校验逻辑。
以下是一些
常见的校验逻辑示例:
1. 输入数据合法性校验
- 非空校验:使用 `!= null` 和 `!= ""` 来判断输入是否为空。
- 数字范围校验:使用 `>=` 和 `<=` 来判断输入是否在指定范围内。
- 日期格式校验:使用 `SimpleDateFormat` 类来验证输入的日期格式是否正确。
- 正则表达式校验:使用 `Pattern` 类和 `Matcher` 类来验证输入
是否符合指定的正则表达式。
2. 数据类型转换校验
- 使用 `try-catch` 块来捕获数据类型转换异常,并进行相应的处理。
- 使用`instanceof` 关键字来判断对象是否属于特定的类或接口。
3. 业务逻辑校验
- 检查输入数据是否符合业务规则,例如订单金额不能为负数,
用户年龄不能超过 100 岁等。
- 检查数据库中是否存在重复的数据,例如用户名或订单号等。
4. 安全校验
- 检查用户输入是否包含敏感信息,例如密码、信用卡号等。
- 对用户输入进行加密或哈希处理,以确保数据传输和存储的安全性。
Java中的⽇期和时间类以及Calendar类⽤法详解Java⽇期和时间类简介Java 的⽇期和时间类位于 java.util 包中。
利⽤⽇期时间类提供的⽅法,可以获取当前的⽇期和时间,创建⽇期和时间参数,计算和⽐较时间。
Date 类Date 类是 Java 中的⽇期时间类,其构造⽅法⽐较多,下⾯是常⽤的两个:Date():使⽤当前的⽇期和时间初始化⼀个对象。
Date(long millisec):从1970年01⽉01⽇00时(格林威治时间)开始以毫秒计算时间,计算 millisec 毫秒。
如果运⾏ Java 程序的本地时区是北京时区(与格林威治时间相差 8 ⼩时),Date dt1=new Date(1000);,那么对象 dt1 就是1970年01⽉01⽇08时00分01秒。
请看⼀个显⽰⽇期时间的例⼦:import java.util.Date;public class Demo{public static void main(String args[]){Date da=new Date(); //创建时间对象System.out.println(da); //显⽰时间和⽇期long msec=da.getTime();System.out.println("从1970年1⽉1⽇0时到现在共有:" + msec + "毫秒");}}运⾏结果:Mon Feb 05 22:50:05 CST 2007从1970年1⽉1⽇0时到现在共有:1170687005390 毫秒⼀些⽐较常⽤的 Date 类⽅法:Date 对象表⽰时间的默认顺序是星期、⽉、⽇、⼩时、分、秒、年。
若需要修改时间显⽰的格式可以使⽤“SimpleDateFormat(String pattern)”⽅法。
例如,⽤不同的格式输出时间:import java.util.Date;import java.text.SimpleDateFormat;public class Demo{public static void main(String args[]){Date da=new Date();System.out.println(da);SimpleDateFormat ma1=new SimpleDateFormat("yyyy 年 MM ⽉ dd ⽇ E 北京时间");System.out.println(ma1.format(da));SimpleDateFormat ma2=new SimpleDateFormat("北京时间:yyyy 年 MM ⽉ dd ⽇ HH 时 mm 分 ss 秒");System.out.println(ma2.format(-1000));}}运⾏结果:Sun Jan 04 17:31:36 CST 20152015 年 01 ⽉ 04 ⽇星期⽇北京时间北京时间:1970 年 01 ⽉ 01 ⽇ 07 时 59 分 59 秒Calendar 类抽象类 Calendar 提供了⼀组⽅法,允许把以毫秒为单位的时间转换成⼀些有⽤的时间组成部分。
java实现判断时间是否为合法时间最近遇到⼀个需求,输⼊字符串,判断为⽇期的话再进⾏后⾯的⽐较⼤⼩之类的操作,但是合法⽇期的格式也是⽐较多的,利⽤正则表达式⼜太长了。
所以后⾯利⽤的⽅法就是,先把输⼊的字符串转成⼀种固定的时间格式,然后利⽤java转String为Date的⽅法,看程序是否抛出异常来判断⽇期是否合法,需要注意的是需要将验证设置为严格的,也就是lenient设置为false,默认为true,不然的会出现例如2019-03-1223为正确的⽇期类型,主要是直接把1223换算成年⽉⽇加上去了。
下⾯代码实现:/*** @author Carol* @date 2020年7⽉14⽇18:11:16* 验证字符串是否为合法⽇期⽀持2019-03-12 2019/03/12 2019.03.12 HH:mm:ss HH:mm常⽤格式* @param date* @return*/public static boolean verifyDateLegal(String date) {if ((date.contains("-") && date.contains("/"))|| (date.contains("-") && date.contains("."))|| (date.contains("/") && date.contains("."))){return false;}date.trim();StringBuilder timeSb = new StringBuilder();date = date.replaceAll("[\\.]|[//]", "-");String[] time = date.split(" ");timeSb.append(time[0]);timeSb.append(" ");if (time.length > 1) {timeSb.append(time[1]);}int i = time.length > 1 ? time[1].length() : 0;for ( ; i < 8 ; i ++) {if (i == 2 || i == 5){timeSb.append(":");} else {timeSb.append("0");}}SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");try {sdf.setLenient(false);sdf.parse(timeSb.toString());return true;} catch (ParseException e) {return false;}}。
java国家节假日判断代码-回复如何使用Java编写一个国家节假日判断代码。
编写一个可以判断中国国家节假日的Java代码非常有用。
这样的代码可以帮助我们自动判断当前日期是否是一个节假日,从而能够准确地安排工作或者休息时间。
以下是一步一步编写这样的代码的详细过程。
首先,我们需要导入Java中的相关类库和模块,以便能够使用日期和时间的功能。
在Java中,日期和时间相关的类主要在`java.util`和`java.time`包中。
因此,我们需要在代码开头添加以下`import`语句:javaimport java.util.Calendar;import java.util.Date;import java.time.LocalDate;接下来,我们可以创建一个名为`HolidayChecker`的Java类,其中包含一个名为`isHoliday`的方法,用于判断给定日期是否是一个中国国家节假日。
代码片段如下:javapublic class HolidayChecker {public boolean isHoliday(Date date) {Calendar calendar = Calendar.getInstance();calendar.setTime(date);int year = calendar.get(Calendar.YEAR);int month = calendar.get(Calendar.MONTH) + 1; 注意月份需要加1,因为Calendar类的月份是从0开始计数的int day = calendar.get(Calendar.DAY_OF_MONTH);在这里编写具体的判断节假日的逻辑return false;}}在`isHoliday`方法中,我们首先通过`Calendar.getInstance()`方法获取一个`Calendar`对象,并将其设置为给定日期。
Java对⽇期Date类进⾏加减运算、年份加减⽉份加减、时间差等等实现代码⼀:import java.text.SimpleDateFormat;import java.util.Calendar;import java.util.Date;public class DateTestUtil {public static void main(String[] args) throws Exception {SimpleDateFormat sdf=new SimpleDateFormat("yyyyMMdd");String str="20110823";Date dt=sdf.parse(str);Calendar rightNow = Calendar.getInstance();rightNow.setTime(dt);rightNow.add(Calendar.YEAR,-1);//⽇期减1年rightNow.add(Calendar.MONTH,3);//⽇期加3个⽉rightNow.add(Calendar.DAY_OF_YEAR,10);//⽇期加10天Date dt1=rightNow.getTime();String reStr = sdf.format(dt1);System.out.println(reStr);}}注:在Calendar对象的add⽅法中,第⼆个参数为正数表⽰“加”,负数表⽰“减”。
代码⼆: java date ⽇期加减天数测试类代码:import java.text.SimpleDateFormat;import java.util.Date;public class DateTest {public static void main(String[] arg){Date now = new Date();addAndSubtractDaysByGetTime(now,-5);addAndSubtractDaysByGetTime(now,5);addAndSubtractDaysByCalendar(now,-5);addAndSubtractDaysByCalendar(now,5);}public static Date addAndSubtractDaysByGetTime(Date dateTime/*待处理的⽇期*/,int n/*加减天数*/){//⽇期格式SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd");SimpleDateFormat dd=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");System.out.println(df.format(new Date(dateTime.getTime() + n * 24 * 60 * 60 * 1000L)));//System.out.println(dd.format(new Date(dateTime.getTime() + n * 24 * 60 * 60 * 1000L)));//注意这⾥⼀定要转换成Long类型,要不n超过25时会出现范围溢出,从⽽得不到想要的⽇期值return new Date(dateTime.getTime() + n * 24 * 60 * 60 * 1000L);}public static Date addAndSubtractDaysByCalendar(Date dateTime/*待处理的⽇期*/,int n/*加减天数*/){//⽇期格式SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd");SimpleDateFormat dd=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");java.util.Calendar calstart = java.util.Calendar.getInstance();calstart.setTime(dateTime);calstart.add(java.util.Calendar.DAY_OF_WEEK, n);System.out.println(df.format(calstart.getTime()));//System.out.println(dd.format(calstart.getTime()));return calstart.getTime();}}运⾏结果:2014-10-062014-10-162014-10-062014-10-16代码三:在⽹上查阅资料,加上⾃⼰总结的⼀些关于Date类的⼯具类。
Java处理Excel中的⽇期格式
Java处理Excel中的⽇期格式
2011-12-23 17:34:03| 分类: |举报 |字号
在Excel中的⽇期格式,其数值为距离1900年1⽉1⽇的天数,⽐如2009-12-24将其转化为数字格式时变成了40171,在⽤java处理的时候,读取的也将是40171。
在POI处理Excel中的⽇期类型的单元格时,如果仅仅是判断它是否为⽇期类型的话,最终会以NUMERIC类型来处理。
正确的处理⽅法是先判断单元格的类型是否则NUMERIC类型,然后再判断单元格是否为⽇期格式,如果是的话,
创建⼀个⽇期格式,再将单元格的内容以这个⽇期格式显⽰出来。
如果单元格不是⽇期格式,那么则直接得到NUMERIC的值就⾏了。
具体代码如下:
if (0 == cell.getCellType()) {
//判断是否为⽇期类型
if(HSSFDateUtil.isCellDateFormatted(cell)){
//⽤于转化为⽇期格式
Date d = cell.getDateCellValue();
DateFormat formater = new SimpleDateFormat("yyyy-MM-dd");
str[k] = formater.format(d);
}else{
// ⽤于格式化数字,只保留数字的整数部分
DecimalFormat df = new DecimalFormat("########");
str[k] = df.format(cell.getNumericCellValue());
}。
java中Date与DateFormat的格式输出Java8中计算⽇期时间差Java8中计算⽇期时间差https:///hspingcc/article/details/73332526____________________________________________________________________________________________________________⼀.简述在Java8中,我们可以使⽤以下类来计算⽇期时间差异:1.Period2.Duration3.ChronoUnit⼆.Period类主要是Period类⽅法getYears(),getMonths()和getDays()来计算.1⽰例:package insping;import java.time.LocalDate;import java.time.Month;import java.time.Period;public class Test {public static void main(String[] args) {LocalDate today = LocalDate.now();System.out.println("Today : " + today);LocalDate birthDate = LocalDate.of(1993, Month.OCTOBER, 19);System.out.println("BirthDate : " + birthDate);Period p = Period.between(birthDate, today);System.out.printf("年龄 : %d 年 %d ⽉ %d ⽇", p.getYears(), p.getMonths(), p.getDays());}}结果:Today : 2017-06-16BirthDate : 1993-10-19年龄 : 23 年 7 ⽉ 28 ⽇三.Duration类提供了使⽤基于时间的值(如秒,纳秒)测量时间量的⽅法。
java⽇期的格式校验第⼀种思路:格式:MM/dd/yyyy HH:mm:ss\d{1,2}/\d{1,2}/\d{4}(\s\d{1,2}:\d{1,2}:\d{1,2})?2019/12/12 11:11:11\d{4}/\d{1,2}/\d{1,2}(\s\d{1,2}:\d{1,2}:\d{1,2})?2017-04-31 11:00:00^(\d{4})-([0-1]\d)-([0-3]\d)\s([0-5]\d):([0-5]\d):([0-5]\d)$实现://校验时间 2019/12/12 11:11:11String serviceReg="\\d{4}/\\d{1,2}/\\d{1,2}(\\s\\d{1,2}:\\d{1,2}:\\d{1,2})?";if(StringUtils.isNotBlank(serviceStartTime)){boolean checkServiceStartTime = serviceStartTime.matches(serviceReg);if(!checkServiceStartTime){archivesSaleInfoImport.setImportFailReason("包含不合法的服务期限");failList.add(archivesSaleInfoImport);continue;}}if(StringUtils.isNotBlank(serviceEndTime)){boolean checkServiceEndTime = serviceEndTime.matches(serviceReg);if(!checkServiceEndTime){archivesSaleInfoImport.setImportFailReason("包含不合法的服务期限");failList.add(archivesSaleInfoImport);continue;}}另⼀种思路:public static boolean isValidDate(String str) {boolean convertSuccess=true; // 指定⽇期格式为四位年/两位⽉份/两位⽇期,注意yyyy/MM/dd区分⼤⼩写;SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd HH:mm");try { // 设置lenient为false. 否则SimpleDateFormat会⽐较宽松地验证⽇期,⽐如2007/02/29会被接受,并转换成2007/03/01 format.setLenient(false);format.parse(str);} catch (ParseException e) {// e.printStackTrace();// 如果throw java.text.ParseException或者NullPointerException,就说明格式不对convertSuccess=false;}return convertSuccess;}基于Jdk1.8线程安全的校验:try {String date = "2021/11/30 11:11:59";final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss");LocalDateTime dateTime = LocalDateTime.parse(date, DATE_TIME_FORMATTER);// LOCAL_DATE_FORMAT.get().parse(date);System.out.println(dateTime.toString().replaceAll("T"," "));} catch (DateTimeParseException e) {System.out.println(e);}。
/*** 正则表达式验证日期格式* @param args*/public static void main(String[] args){String checkValue = "2007-02-29";//String eL ="^((((1[6-9]|[2-9]\\d)\\d{2})-(0?[13578]|1[02])-(0?[1-9]|[12]\\d|3[01]))|(((1[6-9]|[2 -9]\\d)\\d{2})-(0?[13456789]|1[012])-(0?[1-9]|[12]\\d|30))|(((1[6-9]|[2-9]\\d)\\d{ 2})-0?2-(0?[1-9]|1\\d|2[0-8]))|(((1[6-9]|[2-9]\\d)(0[48]|[2468][048]|[13579][26])|((1 6|[2468][048]|[3579][26])00))-0?2-29-))(20|21|22|23|[0-1]?\\d):[0-5]?\\d:[0-5]?\\d$";String eL="^((\\d{2}(([02468][048])|([13579][26]))[\\-\\/\\s]?((((0?[13578])|(1[02]))[\\-\\/\ \s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))[\\-\\/\\s]?((0?[1-9])|([1-2][0 -9])|(30)))|(0?2[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])))))|(\\d{2}(([02468][1235679])|([1 3579][01345789]))[\\-\\/\\s]?((((0?[13578])|(1[02]))[\\-\\/\\s]?((0?[1-9])|([1-2][ 0-9])|(3[01])))|(((0?[469])|(11))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[\\-\\ /\\s]?((0?[1-9])|(1[0-9])|(2[0-8]))))))";Pattern p = pile(eL);Matcher m = p.matcher(checkValue);boolean b = m.matches();if(b){System.out.println("格式正确");}else{System.out.println("格式错误");}}}一、简单的日期判断(YYYY/MM/DD):Java代码^\d{4}(\-|\/|\.)\d{1,2}\1\d{1,2}$^\d{4}(\-|\/|\.)\d{1,2}\1\d{1,2}$二、演化的日期判断(YYYY/MM/DD| YY/MM/DD):Java代码^(^(\d{4}|\d{2})(\-|\/|\.)\d{1,2}\3\d{1,2}$)|(^\d{4}年\d{1,2}月\d{1,2}日$)$^(^(\d{4}|\d{2})(\-|\/|\.)\d{1,2}\3\d{1,2}$)|(^\d{4}年\d{1,2}月\d{1,2}日$)$三、加入闰年的判断的:实例:Java代码^((((1[6-9]|[2-9]\d)\d{2})-(0?[13578]|1[02])-(0?[1-9]|[12]\d|3[01]))|(((1[6-9]|[2-9]\ d)\d{2})-(0?[13456789]|1[012])-(0?[1-9]|[12]\d|30))|(((1[6-9]|[2-9]\d)\d{2})-0?2-(0? [1-9]|1\d|2[0-8]))|(((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048] |[3579][26])00))-0?2-29-))$^((((1[6-9]|[2-9]\d)\d{2})-(0?[13578]|1[02])-(0?[1-9]|[12]\d|3[01]))|(((1[6-9]|[2-9]\ d)\d{2})-(0?[13456789]|1[012])-(0?[1-9]|[12]\d|30))|(((1[6-9]|[2-9]\d)\d{2})-0?2-(0? [1-9]|1\d|2[0-8]))|(((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048] |[3579][26])00))-0?2-29-))$分析:1、什么是合法的日期范围?对于不同的应用场景,这个问题有不同的解释。
这里采纳MSDN中的约定:DateTime值类型表示值范围在公元(基督纪元)0001 年 1 月 1 日午夜12:00:00 到公元(C.E.) 9999 年12 月31 日晚上11:59:59 之间的日期和时间。
2、关于闰年的阐释。
关于公历闰年是这样规定的:地球绕太阳公转一周叫做一回归年,一回归年长365日5时48分46秒。
因此,公历规定有平年和闰年,平年一年有365日,比回归年短0.2422日,四年共短0.9688日,故每四年增加一日,这一年有366日,就是闰年。
但四年增加一日比四个回归年又多0.0312日,400年后将多3.12日,故在400年中少设3个闰年,也就是在400年中只设97个闰年,这样公历年的平均长度与回归年就相近似了。
由此规定:年份是整百数的必须是400的倍数才是闰年,例如1900年、2100年就不是闰年。
首先需要验证年份,显然,年份范围为0001 - 9999,匹配YYYY的正则表达式为:Java代码[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-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-9] 也可以表示为\d,但\d 不如[0-9] 直观,因此下面我将一直采用[0-9]用正则表达式验证日期的难点有二:一是大小月份的天数不同,二是闰年的考虑。
对于第一个难点,我们首先不考虑闰年,假设2月份都是28天,这样,月份和日期可以分成三种情况:1、月份为1, 3, 5, 7, 8, 10, 12,天数范围为01 - 31,匹配MM-DD的正则表达式为:Java代码(0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01])(0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01])2、月份为4, 6, 9, 11,天数范围为01-30,匹配MM-DD的正则表达式为:Java代码(0[469]|11)-(0[1-9]|[12][0-9]|30)(0[469]|11)-(0[1-9]|[12][0-9]|30)3、月份为2,考虑平年情况,匹配MM-DD的正则表达式为:Java代码02-(0[1-9]|[1][0-9]|2[0-8])02-(0[1-9]|[1][0-9]|2[0-8])根据上面的成果,我们可以得到匹配平年日期格式为YYYY-MM-DD的正则表达式:Java代码([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]{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])))接着我们来解决第二个难点:闰年的考虑。
根据闰年的定义,我们可以将闰年分为两类:1、能被4整除但不能被100整除的年份。
寻找后两位的变化规律,可以很快得到下面的正则匹配:Java代码([0-9]{2})(0[48]|[2468][048]|[13579][26])([0-9]{2})(0[48]|[2468][048]|[13579][26])2、能被400整除的年份。
能被400整除的数肯定能被100整除,因此后两位肯定是00,我们只要保证前两位能被4整除即可,相应的正则表达式为:Java代码(0[48]|[2468][048]|[3579][26])00(0[48]|[2468][048]|[3579][26])002.最强验证日期的正则表达式,添加了闰年的验证这个日期正则表达式支持YYYY-MM-DDYYYY/MM/DDYYYY_MM_DDYYYY.MM.DD的形式match : 2008-2-29 2008/02/29not match : 2008-2-30 2007-2-29完整的正则表达式如下:Java代码((^((1[8-9]\d{2})|([2-9]\d{3}))([-\/\._])(10|12|0?[13578])([-\/\._])(3[01]|[12][0-9]|0?[ 1-9])$)|(^((1[8-9]\d{2})|([2-9]\d{3}))([-\/\._])(11|0?[469])([-\/\._])(30|[12][0-9]|0?[1 -9])$)|(^((1[8-9]\d{2})|([2-9]\d{3}))([-\/\._])(0?2)([-\/\._])(2[0-8]|1[0-9]|0?[1-9])$)|( ^([2468][048]00)([-\/\._])(0?2)([-\/\._])(29)$)|(^([3579][26]00)([-\/\._])(0?2)([-\/\._ ])(29)$)|(^([1][89][0][48])([-\/\._])(0?2)([-\/\._])(29)$)|(^([2-9][0-9][0][48])([-\/\._]) (0?2)([-\/\._])(29)$)|(^([1][89][2468][048])([-\/\._])(0?2)([-\/\._])(29)$)|(^([2-9][0-9 ][2468][048])([-\/\._])(0?2)([-\/\._])(29)$)|(^([1][89][13579][26])([-\/\._])(0?2)([-\/ \._])(29)$)|(^([2-9][0-9][13579][26])([-\/\._])(0?2)([-\/\._])(29)$))((^((1[8-9]\d{2})|([2-9]\d{3}))([-\/\._])(10|12|0?[13578])([-\/\._])(3[01]|[12][0-9]|0?[ 1-9])$)|(^((1[8-9]\d{2})|([2-9]\d{3}))([-\/\._])(11|0?[469])([-\/\._])(30|[12][0-9]|0?[1 -9])$)|(^((1[8-9]\d{2})|([2-9]\d{3}))([-\/\._])(0?2)([-\/\._])(2[0-8]|1[0-9]|0?[1-9])$)|( ^([2468][048]00)([-\/\._])(0?2)([-\/\._])(29)$)|(^([3579][26]00)([-\/\._])(0?2)([-\/\._ ])(29)$)|(^([1][89][0][48])([-\/\._])(0?2)([-\/\._])(29)$)|(^([2-9][0-9][0][48])([-\/\._]) (0?2)([-\/\._])(29)$)|(^([1][89][2468][048])([-\/\._])(0?2)([-\/\._])(29)$)|(^([2-9][0-9 ][2468][048])([-\/\._])(0?2)([-\/\._])(29)$)|(^([1][89][13579][26])([-\/\._])(0?2)([-\/ \._])(29)$)|(^([2-9][0-9][13579][26])([-\/\._])(0?2)([-\/\._])(29)$))闰年的2月份有29天,因此匹配闰年日期格式为YYYY-MM-DD的正则表达式为:(([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))-02-29最后,将平年和闰年的日期验证表达式合并,我们得到最终的验证日期格式为YYYY-MM-DD的正则表达式为:Java代码(([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-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)DD/MM/YYYY格式的正则验证表达式为:Java代码(((0[1-9]|[12][0-9]|3[01])/((0[13578]|1[02]))|((0[1-9]|[12][0-9]|30)/(0[469]|11))|(0[1-9]|[1][0-9]|2[0-8])/(02))/([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}))|(29/02/(([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3 579][26])00)))。