龙空技术网

如何校验字符串类型的日期?

爱码僧 274

前言:

今天我们对“java校验时间格式”可能比较看重,小伙伴们都想要知道一些“java校验时间格式”的相关内容。那么小编同时在网上搜集了一些对于“java校验时间格式””的相关知识,希望姐妹们能喜欢,大家快快来学习一下吧!

前后端不可避免的会有日期或者时间戳的交互传递,到底用什么类型进行传递日期好那就见仁见智了,个人还是感觉字符串用着方便,特别有了Java8开始支持的LocalDateTime、LocalDate、以及Spring的ConstraintValidator接口,字符串用起来更是得心应手。

1、首先创建一个注解类

package com.falcon.design.aop.annotation;import javax.validation.Constraint;import javax.validation.Payload;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;@Target(value = {ElementType.FIELD, ElementType.PARAMETER})@Retention(RetentionPolicy.RUNTIME)@Constraint(validatedBy = DateTimeValidator.class)public @interface DateStrFormat {    String message() default "日期格式错误";    String format() default "yyyy-MM-dd";    Class<?>[] groups() default {};    Class<? extends Payload>[] payload() default {};}

2、创建验证该注解的实现类

package com.falcon.design.aop.annotation;import javax.validation.ConstraintValidator;import javax.validation.ConstraintValidatorContext;import java.time.format.DateTimeFormatter;public class DateTimeValidator implements ConstraintValidator<DateStrFormat,String> {    private DateStrFormat dateStrFormat;    @Override    public void initialize(DateStrFormat localDateTime) {        this.dateStrFormat = localDateTime;    }    @Override    public boolean isValid(String value, ConstraintValidatorContext context) {        //如果注解的字段为空则不校验,直接返回true        if(value == null || value.length() ==0){            return true;        }        String format = dateStrFormat.format();        //如果被注解字段值的长度和format不一致,则肯定校验不通过返回false        if(value.length() != format.length()){            return false;        }        try{            DateTimeFormatter.ofPattern(format).parse(value);        }catch (Exception e){            return false;        }        return true;    }}

3、使用

Postman请求:

请求

返回结果:

{    "timestamp": "2020-09-18T18:07:26.808+0000",    "status": 400,    "error": "Bad Request",    "errors": [        {            "codes": [                "DateStrFormat.user.time",                "DateStrFormat.time",                "DateStrFormat.java.lang.String",                "DateStrFormat"            ],            "arguments": [                {                    "codes": [                        "user.time",                        "time"                    ],                    "arguments": null,                    "defaultMessage": "time",                    "code": "time"                },                {                    "arguments": null,                    "defaultMessage": "yyyyMMdd HH:mm:ss",                    "codes": [                        "yyyyMMdd HH:mm:ss"                    ]                }            ],            "defaultMessage": "日期格式错误",            "objectName": "user",            "field": "time",            "rejectedValue": "2020/09/19",            "bindingFailure": false,            "code": "DateStrFormat"        }    ],    "message": "Validation failed for object='user'. Error count: 1",    "path": "/hello"}

可以看到优雅的校验住了字符串类型的时间格式,但是不太优雅的地方在于这个json会原样的返回到前端,并不是前端想要的结果,我们希望只返回字符串类型错误就行了,这个问题我们留在下文探讨。

原创不易,产生共鸣的朋友不妨关注赞赏支持,老衲将不甚感激!

标签: #java校验时间格式