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

本文介绍了一种使用Java注解及验证器实现日期字符串格式校验的方法。通过自定义注解DateStrFormat结合DateTimeValidator实现对指定格式日期字符串的校验,并展示了如何在Postman中测试该功能。

前后端不可避免的会有日期或者时间戳的交互传递,到底用什么类型进行传递日期好那就见仁见智了,个人还是感觉字符串用着方便,特别有了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会原样的返回到前端,并不是前端想要的结果,我们希望只返回字符串类型错误就行了,这个问题我们留在下文探讨。

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

<think>好的,用户的问题是关于Delphi中如何判断一个字符串是否是有效的日期。我需要根据提供的引用内容来回答。首先,用户提到了TryStrToDate或者其他方法,这可能意味着他们知道TryStrToDate的存在,但想确认是否有其他方法或者更详细的信息。 根据引用[2],Delphi提供了TryStrToDate、TryStrToTime和TryStrToDateTime函数,这些函数会尝试将字符串转换为日期、时间或日期时间,并返回一个布尔值表示是否成功。这些函数应该是最直接的方法。用户可能需要具体的用法示例,所以需要提供代码示例来说明如何调用这些函数。 此外,用户可能想知道是否存在其他方法,比如使用异常处理,比如StrToDate函数在转换失败时会抛出异常,但这种方法不如TryStrToDate安全,因为需要处理异常,可能会影响性能。所以应该推荐使用TryStrToDate系列函数,避免异常的开销。 另外,用户提供的引用[2]中的IsValidDate函数实际上就是调用了TryStrToDate,所以可能需要解释这一点,并建议用户直接使用TryStrToDate,或者参考这些自定义函数的结构。 需要确保回答结构清晰,分点说明不同方法,并提供代码示例。同时,根据用户的问题,重点在于判断字符串是否为日期,所以主要关注TryStrToDate,但也可以简要提到其他相关函数如TryStrToDateTime,如果字符串包含时间部分的话。 最后,用户可能需要了解这些函数属于哪个单元,根据引用[1]和[2],SysUtils.pas单元中包含这些函数,因此需要指出需要引用SysUtils单元。 总结回答的要点: 1. 使用TryStrToDate函数,返回布尔值,成功转换则有效。 2. 提供示例代码说明用法。 3. 提到TryStrToDateTime用于同时包含日期和时间的情况。 4. 对比StrToDate的异常处理方法,指出TryStrToDate更安全。 5. 引用SysUtils单元。 6. 根据引用[2]中的自定义函数,说明如何封装这些函数。 需要确保回答中的代码格式正确,使用中文,并正确引用提供的参考文献。可能还需要生成相关问题,比如如何判断时间、如何处理不同的日期格式等。</think>在Delphi中判断字符串是否为有效日期,主要可通过以下方法实现: ### 一、标准库函数解决方案 1. **TryStrToDate**函数(推荐方法) ```delphi var strDate: string; dtValue: TDateTime; begin strDate := '2023-07-15'; if TryStrToDate(strDate, dtValue) then ShowMessage('有效日期') else ShowMessage('无效日期'); end; ``` - **函数原型**:`function TryStrToDate(const S: string; out Value: TDateTime): Boolean;` - **功能**:尝试将字符串转换为TDateTime类型,转换成功返回True[^2] - **注意**:需引用`SysUtils`单元 2. **TryStrToDateTime**函数(含时间判断) ```delphi if TryStrToDateTime('2023-07-15 14:30:00', dtValue) then // 处理有效日期时间 ``` ### 二、异常处理方法(不推荐) 使用`StrToDate`函数配合异常捕获: ```delphi try dtValue := StrToDate('2023-02-30'); // 故意写错误日期 except on EConvertError do ShowMessage('日期格式错误'); end; ``` ### 三、自定义验证函数 根据引用[2]提供的示例: ```delphi function IsValidDate(const DateString: string): Boolean; var DT: TDateTime; begin Result := TryStrToDate(DateString, DT); end; ``` ### 四、重要说明 1. 日期格式受系统区域设置影响,可通过`ShortDateFormat`变量调整 2. 建议使用`Try*`函数族避免异常处理开销 3. 严格校验时建议配合`TFormatSettings`指定格式 相关问题
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值