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

打印 上一主题 下一主题

主题 827|帖子 827|积分 2481

引言

我们在使用SpringMVC从前端接受传递过来的日期数据时,默认传递过来的数据是String类型,如果我们从前端传递过来的数据格式是yyyy/MM/dd,SpringMVC有内置类型转化器会将String类型自动转化成Date类型。但如果我们从前端传递过来的数据格式是yyyy-MM-dd,SpringMVC的内置转化器就不能自动转化了,就得我们自定义一个类型转化器。
注意:如果我们自定义类型转化器之后,SpringMVC支持内置类型转化器就不会在生效了。
创建自定义字符串类型转日期类型的类型转化器类
  1. package com.qrj.converter;
  2. import org.springframework.core.convert.converter.Converter;
  3. import org.springframework.core.convert.support.GenericConversionService;
  4. import java.text.SimpleDateFormat;
  5. import java.util.Date;
  6. import java.util.regex.Pattern;
  7. /**
  8. * @author: qrj
  9. * @description 自定义字符串类型转日期类型的类型转换器
  10. * @Date: 2023/9/29 16:41
  11. */
  12. public class StringToDateConverter implements Converter<String, Date> {
  13.     @Override
  14.     public Date convert(String s) {
  15.         Date date = null;
  16.         try{
  17.             SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
  18.             date = simpleDateFormat.parse(s);
  19.         }catch (Exception e){
  20.             e.printStackTrace();
  21.         }
  22.         return date;
  23.     }
  24. }
复制代码
我们一个在类型转化器类里面写一个main方法进行测试,看能不能将yyyy-MM-dd格式的字符串转化成Date类型的数据。
  1. public static void main(String[] args) {
  2.         //创建类型转换服务实例
  3.         GenericConversionService genericConversionService = new GenericConversionService();
  4.         //想类型转换服务实例中注册自定义类型转换器
  5.         genericConversionService.addConverter(new StringToDateConverter());
  6.         //使用自定义类型转换器
  7.         String dateStr = "2023-9-29";
  8.         Date date = genericConversionService.convert(dateStr,Date.class);
  9.         System.out.println(date);
  10. }
复制代码
测试结果如下:

测试成功,自定义类型转化器可以将yyyy-MM-dd格式的字符串转化成Date类型的数据。
但问题来咯!有自定义类型转化器之后,SpringMVC支持内置类型转化器就不会在生效。如果我们前端数据传一个yyyy/MM/dd格式的日期呢???
解决这个问题,我们是不是应该进行一个判断,这里正则表达式就出场咯。如果前端传递过来的是yyyy-MM-dd格式的字符串,就将它转化为Date类型,如果前端传递过来的是yyyy/MM/dd格式的字符串,也将它转化为Date类型。
用正则表达式判断日期字符串是否合法
  1. package com.qrj.converter;
  2. import org.springframework.core.convert.converter.Converter;
  3. import org.springframework.core.convert.support.GenericConversionService;
  4. import java.text.SimpleDateFormat;
  5. import java.util.Date;
  6. import java.util.regex.Pattern;
  7. /**
  8. * @author: qrj
  9. * @description 自定义字符串类型转日期类型的类型转换器
  10. * @Date: 2023/9/29 16:41
  11. */
  12. public class StringToDateConverter implements Converter<String, Date> {
  13.     @Override
  14.     public Date convert(String s) {
  15.         Date date = null;
  16.         SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
  17.         try{
  18.             //可以使用正则表达式判断日期字符串格式是否合法(支持 yyyy-MM-dd 和 yyyy/MM/dd 格式)
  19.             boolean isMate1 = Pattern.matches("^(\\d{4})-(\\d{2})-(\\d{2})$",s);
  20.             if (isMate1 == true){
  21.                 simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
  22.             }
  23.             boolean isMate2 = Pattern.matches("^(\\d{4})/(\\d{2})/(\\d{2})$",s);
  24.             if (isMate2 == true){
  25.                simpleDateFormat = new SimpleDateFormat("yyyy/MM/dd");
  26.             }
  27.             date = simpleDateFormat.parse(s);
  28.         }catch (Exception e){
  29.             e.printStackTrace();
  30.         }
  31.         return date;
  32.     }
  33. }
复制代码
注意:上面Pattern.matches()方法是Java中用于检查给定字符串是否与给定模式匹配的静态方法。它接受两个参数:第一个参数是表示正则表达式模式的字符串,第二个参数是待检查的字符串。
编写测试代码,进行测试:
  1. //测试自定义类型转换器
  2.     public static void main(String[] args) {
  3.         //创建类型转换服务实例
  4.         GenericConversionService genericConversionService = new GenericConversionService();
  5.         //想类型转换服务实例中注册自定义类型转换器
  6.         genericConversionService.addConverter(new StringToDateConverter());
  7.         //使用自定义类型转换器
  8.         String dateStr = "2023/9/29";
  9.         Date date = genericConversionService.convert(dateStr,Date.class);
  10.         System.out.println(date);
  11. }
复制代码
测试结果如下:

报错原因是无法解析的date :"2023/9/29" 
遇到问题

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

为了解决这一问题,可以通过修改正则表达式的月份跟日期部分为(\\d{1,2})使其匹配一到两位数字。以下是修改后的代码:
  1. package com.qrj.converter;
  2. import org.springframework.core.convert.converter.Converter;
  3. import org.springframework.core.convert.support.GenericConversionService;
  4. import java.text.SimpleDateFormat;
  5. import java.util.Date;
  6. import java.util.regex.Pattern;
  7. /**
  8. * @author: qrj
  9. * @description 自定义字符串类型转日期类型的类型转换器
  10. * @Date: 2023/9/29 16:41
  11. */
  12. public class StringToDateConverter implements Converter<String, Date> {
  13.     @Override
  14.     public Date convert(String s) {
  15.         Date date = null;
  16.         SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
  17.         try{
  18.             //可以使用正则表达式判断日期字符串格式是否合法(支持 yyyy-MM-dd 和 yyyy/MM/dd 格式)
  19.             boolean isMate1 = Pattern.matches("^(\\d{4})-(\\d{2})-(\\d{2})$",s);
  20.             if (isMate1){
  21.                 simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
  22.             }
  23.             boolean isMate2 = Pattern.matches("^(\\d{4})/(\\d{1,2})/(\\d{1,2})$",s);
  24.             if (isMate2){
  25.                simpleDateFormat = new SimpleDateFormat("yyyy/MM/dd");
  26.             }
  27.             date = simpleDateFormat.parse(s);
  28.         }catch (Exception e){
  29.             e.printStackTrace();
  30.         }
  31.         return date;
  32.     }
  33.     //测试自定义类型转换器
  34.     public static void main(String[] args) {
  35.         //创建类型转换服务实例
  36.         GenericConversionService genericConversionService = new GenericConversionService();
  37.         //想类型转换服务实例中注册自定义类型转换器
  38.         genericConversionService.addConverter(new StringToDateConverter());
  39.         //使用自定义类型转换器
  40.         String dateStr = "2023/9/29";
  41.         String dateStr2 = "2023-9-30";
  42.         Date date = genericConversionService.convert(dateStr,Date.class);
  43.         Date date2 = genericConversionService.convert(dateStr2,Date.class);
  44.         System.out.println(date);
  45.         System.out.println(date2);
  46.     }
  47. }
复制代码
进行测试如下:

成功将yyyy-MM-dd格式和yyyy/MM/dd格式的字符串转化成Date类型的数据。
正则表达式
  1. "^(\\d{4})-(\\d{2})-(\\d{2})$"
  2. "^(\\d{4})/(\\d{1,2})/(\\d{1,2})$"
复制代码
^:匹配字符串的开头
(\\d{4}):匹配四位数字,表示年份
-或/:匹配横杠或斜杠字符
(\\d{1,2}):匹配一到两位数字,表示月份或日期
$:匹配字符串的结尾

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

大连密封材料

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表