引言
我們?cè)谑褂肧pringMVC從前端接受傳遞過(guò)來(lái)的日期數(shù)據(jù)時(shí),默認(rèn)傳遞過(guò)來(lái)的數(shù)據(jù)是String類型,如果我們從前端傳遞過(guò)來(lái)的數(shù)據(jù)格式是yyyy/MM/dd,SpringMVC有內(nèi)置類型轉(zhuǎn)化器會(huì)將String類型自動(dòng)轉(zhuǎn)化成Date類型。但如果我們從前端傳遞過(guò)來(lái)的數(shù)據(jù)格式是yyyy-MM-dd,SpringMVC的內(nèi)置轉(zhuǎn)化器就不能自動(dòng)轉(zhuǎn)化了,就得我們自定義一個(gè)類型轉(zhuǎn)化器。
注意:如果我們自定義類型轉(zhuǎn)化器之后,SpringMVC支持內(nèi)置類型轉(zhuǎn)化器就不會(huì)在生效了。
創(chuàng)建自定義字符串類型轉(zhuǎn)日期類型的類型轉(zhuǎn)化器類
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 自定義字符串類型轉(zhuǎn)日期類型的類型轉(zhuǎn)換器
* @Date: 2023/9/29 16:41
*/
public class StringToDateConverter implements Converter<String, Date> {
@Override
public 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;
}
}
我們一個(gè)在類型轉(zhuǎn)化器類里面寫(xiě)一個(gè)main方法進(jìn)行測(cè)試,看能不能將yyyy-MM-dd格式的字符串轉(zhuǎn)化成Date類型的數(shù)據(jù)。
public static void main(String[] args) {
//創(chuàng)建類型轉(zhuǎn)換服務(wù)實(shí)例
GenericConversionService genericConversionService = new GenericConversionService();
//想類型轉(zhuǎn)換服務(wù)實(shí)例中注冊(cè)自定義類型轉(zhuǎn)換器
genericConversionService.addConverter(new StringToDateConverter());
//使用自定義類型轉(zhuǎn)換器
String dateStr = "2023-9-29";
Date date = genericConversionService.convert(dateStr,Date.class);
System.out.println(date);
}
測(cè)試結(jié)果如下:
測(cè)試成功,自定義類型轉(zhuǎn)化器可以將yyyy-MM-dd格式的字符串轉(zhuǎn)化成Date類型的數(shù)據(jù)。
但問(wèn)題來(lái)咯!有自定義類型轉(zhuǎn)化器之后,SpringMVC支持內(nèi)置類型轉(zhuǎn)化器就不會(huì)在生效。如果我們前端數(shù)據(jù)傳一個(gè)yyyy/MM/dd格式的日期呢???
解決這個(gè)問(wèn)題,我們是不是應(yīng)該進(jìn)行一個(gè)判斷,這里正則表達(dá)式就出場(chǎng)咯。如果前端傳遞過(guò)來(lái)的是yyyy-MM-dd格式的字符串,就將它轉(zhuǎn)化為Date類型,如果前端傳遞過(guò)來(lái)的是yyyy/MM/dd格式的字符串,也將它轉(zhuǎn)化為Date類型。
用正則表達(dá)式判斷日期字符串是否合法
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 自定義字符串類型轉(zhuǎn)日期類型的類型轉(zhuǎn)換器
* @Date: 2023/9/29 16:41
*/
public class StringToDateConverter implements Converter<String, Date> {
@Override
public Date convert(String s) {
Date date = null;
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
try{
//可以使用正則表達(dá)式判斷日期字符串格式是否合法(支持 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中用于檢查給定字符串是否與給定模式匹配的靜態(tài)方法。它接受兩個(gè)參數(shù):第一個(gè)參數(shù)是表示正則表達(dá)式模式的字符串,第二個(gè)參數(shù)是待檢查的字符串。
編寫(xiě)測(cè)試代碼,進(jìn)行測(cè)試:
//測(cè)試自定義類型轉(zhuǎn)換器
public static void main(String[] args) {
//創(chuàng)建類型轉(zhuǎn)換服務(wù)實(shí)例
GenericConversionService genericConversionService = new GenericConversionService();
//想類型轉(zhuǎn)換服務(wù)實(shí)例中注冊(cè)自定義類型轉(zhuǎn)換器
genericConversionService.addConverter(new StringToDateConverter());
//使用自定義類型轉(zhuǎn)換器
String dateStr = "2023/9/29";
Date date = genericConversionService.convert(dateStr,Date.class);
System.out.println(date);
}
測(cè)試結(jié)果如下:
報(bào)錯(cuò)原因是無(wú)法解析的date :"2023/9/29"?
遇到問(wèn)題
在網(wǎng)上查詢資料得知,原因是在 SimpleDateFormat中使用的日期格式與實(shí)際的日期字符串格式不匹配,導(dǎo)致無(wú)法解析。在"2023/9/29"這種格式的日期字符串中,月份部分只有一位數(shù)字,日期部分有兩位數(shù)字,而在正則表達(dá)式中(\\d{2})日期和月份部分匹配兩位數(shù)字。這使得2023/9/29與正則表達(dá)式不匹配,返回false,無(wú)法將2023/9/29這種格式的日期字符串解析。
解決問(wèn)題
為了解決這一問(wèn)題,可以通過(guò)修改正則表達(dá)式的月份跟日期部分為(\\d{1,2})使其匹配一到兩位數(shù)字。以下是修改后的代碼:
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 自定義字符串類型轉(zhuǎn)日期類型的類型轉(zhuǎn)換器
* @Date: 2023/9/29 16:41
*/
public class StringToDateConverter implements Converter<String, Date> {
@Override
public Date convert(String s) {
Date date = null;
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
try{
//可以使用正則表達(dá)式判斷日期字符串格式是否合法(支持 yyyy-MM-dd 和 yyyy/MM/dd 格式)
boolean isMate1 = Pattern.matches("^(\\d{4})-(\\d{2})-(\\d{2})$",s);
if (isMate1){
simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
}
boolean isMate2 = Pattern.matches("^(\\d{4})/(\\d{1,2})/(\\d{1,2})$",s);
if (isMate2){
simpleDateFormat = new SimpleDateFormat("yyyy/MM/dd");
}
date = simpleDateFormat.parse(s);
}catch (Exception e){
e.printStackTrace();
}
return date;
}
//測(cè)試自定義類型轉(zhuǎn)換器
public static void main(String[] args) {
//創(chuàng)建類型轉(zhuǎn)換服務(wù)實(shí)例
GenericConversionService genericConversionService = new GenericConversionService();
//想類型轉(zhuǎn)換服務(wù)實(shí)例中注冊(cè)自定義類型轉(zhuǎn)換器
genericConversionService.addConverter(new StringToDateConverter());
//使用自定義類型轉(zhuǎn)換器
String dateStr = "2023/9/29";
String dateStr2 = "2023-9-30";
Date date = genericConversionService.convert(dateStr,Date.class);
Date date2 = genericConversionService.convert(dateStr2,Date.class);
System.out.println(date);
System.out.println(date2);
}
}
進(jìn)行測(cè)試如下:
成功將yyyy-MM-dd格式和yyyy/MM/dd格式的字符串轉(zhuǎn)化成Date類型的數(shù)據(jù)。
正則表達(dá)式
"^(\\d{4})-(\\d{2})-(\\d{2})$"
"^(\\d{4})/(\\d{1,2})/(\\d{1,2})$"
^:匹配字符串的開(kāi)頭
(\\d{4}):匹配四位數(shù)字,表示年份
-或/:匹配橫杠或斜杠字符
(\\d{1,2}):匹配一到兩位數(shù)字,表示月份或日期文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-711979.html
$:匹配字符串的結(jié)尾文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-711979.html
到了這里,關(guān)于使用正則表達(dá)式判斷日期字符串格式是否合法遇到的問(wèn)題(解決)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!