使用正则表达式判断日期字符串格式是否合法遇到的问题(解决)

编程入门 行业动态 更新时间:2024-10-07 08:25:55

使用正则表达式判断日期<a href=https://www.elefans.com/category/jswz/34/1771434.html style=字符串格式是否合法遇到的问题(解决)"/>

使用正则表达式判断日期字符串格式是否合法遇到的问题(解决)

引言

我们在使用SpringMVC从前端接受传递过来的日期数据时,默认传递过来的数据是String类型,如果我们从前端传递过来的数据格式是yyyy/MM/dd,SpringMVC有内置类型转化器会将String类型自动转化成Date类型。但如果我们从前端传递过来的数据格式是yyyy-MM-dd,SpringMVC的内置转化器就不能自动转化了,就得我们自定义一个类型转化器。

注意:如果我们自定义类型转化器之后,SpringMVC支持内置类型转化器就不会在生效了。

创建自定义字符串类型转日期类型的类型转化器类

package com.qrj.converter;import org.springframework.core.convert.converter.Converter;
import org.springframework.core.convert.support.GenericConversionService;import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.regex.Pattern;/*** @author: qrj* @description 自定义字符串类型转日期类型的类型转换器* @Date: 2023/9/13 16:41*/
public class StringToDateConverter implements Converter<String, Date> {@Overridepublic Date convert(String s) {Date date = null;try{SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");date = simpleDateFormat.parse(s);}catch (Exception e){e.printStackTrace();}return date;}
}

我们一个在类型转化器类里面写一个main方法进行测试,看能不能将yyyy-MM-dd格式的字符串转化成Date类型的数据

public static void main(String[] args) {//创建类型转换服务实例GenericConversionService genericConversionService = new GenericConversionService();//想类型转换服务实例中注册自定义类型转换器genericConversionService.addConverter(new StringToDateConverter());//使用自定义类型转换器String dateStr = "2023-9-13";Date date = genericConversionService.convert(dateStr,Date.class);System.out.println(date);}

测试结果如下:

测试成功,自定义类型转化器可以将yyyy-MM-dd格式的字符串转化成Date类型的数据。

但问题来咯!有自定义类型转化器之后,SpringMVC支持内置类型转化器就不会在生效。如果我们前端数据传一个yyyy/MM/dd格式的日期呢???

解决这个问题,我们是不是应该进行一个判断,这里正则表达式就出场咯。如果前端传递过来的是yyyy-MM-dd格式的字符串,就将它转化为Date类型,如果前端传递过来的是yyyy/MM/dd格式的字符串,也将它转化为Date类型。

用正则表达式判断日期字符串是否合法

package com.qrj.converter;import org.springframework.core.convert.converter.Converter;
import org.springframework.core.convert.support.GenericConversionService;import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.regex.Pattern;/*** @author: qrj* @description 自定义字符串类型转日期类型的类型转换器* @Date: 2023/9/13 16:41*/
public class StringToDateConverter implements Converter<String, Date> {@Overridepublic Date convert(String s) {Date date = null;SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");try{//可以使用正则表达式判断日期字符串格式是否合法(支持 yyyy-MM-dd 和 yyyy/MM/dd 格式)boolean isMate1 = Pattern.matches("^(\\d{4})-(\\d{2})-(\\d{2})$",s);if (isMate1 == true){simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");}boolean isMate2 = Pattern.matches("^(\\d{4})/(\\d{2})/(\\d{2})$",s);if (isMate2 == true){simpleDateFormat = new SimpleDateFormat("yyyy/MM/dd");}date = simpleDateFormat.parse(s);}catch (Exception e){e.printStackTrace();}return date;}
}

注意:上面Pattern.matches()方法是Java中用于检查给定字符串是否与给定模式匹配的静态方法。它接受两个参数:第一个参数是表示正则表达式模式的字符串,第二个参数是待检查的字符串。

编写测试代码,进行测试

//测试自定义类型转换器public static void main(String[] args) {//创建类型转换服务实例GenericConversionService genericConversionService = new GenericConversionService();//想类型转换服务实例中注册自定义类型转换器genericConversionService.addConverter(new StringToDateConverter());//使用自定义类型转换器String dateStr = "2023/9/13";Date date = genericConversionService.convert(dateStr,Date.class);System.out.println(date);}

测试结果如下:

报错原因是无法解析的date :"2023/9/13"

遇到问题

在网上查询资料得知,原因是在 SimpleDateFormat中使用的日期格式与实际的日期字符串格式不匹配,导致无法解析。在"2023/9/13"这种格式的日期字符串中,月份部分只有一位数字,日期部分有两位数字,而在正则表达式中(\\d{2})日期和月份部分匹配两位数字。这使得2023/9/13与正则表达式不匹配,返回false,无法将2023/9/13这种格式的日期字符串解析。

解决问题

为了解决这一问题,可以通过修改正则表达式的月份跟日期部分为(\\d{1,2})使其匹配一到两位数字。以下是修改后的代码:

package com.qrj.converter;import org.springframework.core.convert.converter.Converter;
import org.springframework.core.convert.support.GenericConversionService;import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.regex.Pattern;/*** @author: qrj* @description 自定义字符串类型转日期类型的类型转换器* @Date: 2023/9/13 16:41*/
public class StringToDateConverter implements Converter<String, Date> {@Overridepublic Date convert(String s) {Date date = null;SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");try{//可以使用正则表达式判断日期字符串格式是否合法(支持 yyyy-MM-dd 和 yyyy/MM/dd 格式)boolean isMate1 = Pattern.matches("^(\\d{4})-(\\d{2})-(\\d{2})$",s);if (isMate1 == true){simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");}boolean isMate2 = Pattern.matches("^(\\d{4})/(\\d{1,2})/(\\d{1,2})$",s);if (isMate2 == true){simpleDateFormat = new SimpleDateFormat("yyyy/MM/dd");}date = simpleDateFormat.parse(s);}catch (Exception e){e.printStackTrace();}return date;}//测试自定义类型转换器public static void main(String[] args) {//创建类型转换服务实例GenericConversionService genericConversionService = new GenericConversionService();//想类型转换服务实例中注册自定义类型转换器genericConversionService.addConverter(new StringToDateConverter());//使用自定义类型转换器String dateStr = "2023/9/13";String dateStr2 = "2023-9-14";Date date = genericConversionService.convert(dateStr,Date.class);Date date2 = genericConversionService.convert(dateStr2,Date.class);System.out.println(date);System.out.println(date2);}
}

进行测试如下:

成功将yyyy-MM-dd格式和yyyy/MM/dd格式的字符串转化成Date类型的数据。

正则表达式

"^(\\d{4})-(\\d{2})-(\\d{2})$""^(\\d{4})/(\\d{1,2})/(\\d{1,2})$"

^:匹配字符串的开头

(\\d{4}):匹配四位数字,表示年份

-或/:匹配横杠或斜杠字符

(\\d{1,2}):匹配一到两位数字,表示月份或日期

$:匹配字符串的结尾

更多推荐

使用正则表达式判断日期字符串格式是否合法遇到的问题(解决)

本文发布于:2024-02-27 18:12:32,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1765742.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:字符串   是否合法   日期   格式   正则表达式

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!