检查字符串是否为合法的日期格式从以下三个方面说起:

1、字符串格式是否正确,比如格式是否是yyyy-MM-dd

2、时间是否在合法范围内,比如我们需要限定在一个月内的时间

3、字符串是否可以解析为正常的时间,比如2月30号就不是正常的时间

第一种:使用DateFormat检查

1、定义时间校验器的接口

接口方法接收一个字符串,返回布尔类型,标识字符串是否是合法的时间格式

public interface DateValidator {boolean isValid(String dateStr);}

2、使用DateFormat检查

Java提供了格式化和解析时间的工具:DateFormat抽象类和SimpleDateFormat实现类,借此实现时间校验器。

import com.example.smile.result.configuration.DateValidator;
import java.text.DateFormat;
import java.text.SimpleDateFormat;public class DateValidatorUsingDateFormat implements DateValidator {private final String dateFormat;public DateValidatorUsingDateFormat(String dateFormat) {this.dateFormat = dateFormat;}@Overridepublic boolean isValid(String dateStr) {final DateFormat sdf = new SimpleDateFormat(this.dateFormat);sdf.setLenient(false);try {sdf.parse(dateStr);}catch (Exception e){System.out.println("false");return false;}System.out.println("true");return true;}
}

3、使用示例

需要注意的是DateFormat和SimpleDateFormat是非线程安全的,所以每次方法调用时,都需要新建实例。

import com.example.smile.result.configuration.DateValidator;
import com.example.smile.result.utils.DateValidatorUsingDateFormat;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;@SpringBootTest
@Slf4j
public class DateValidatorUsingDateFormatTest {@Testvoid isValid(){final DateValidator validator = new DateValidatorUsingDateFormat("yyyy-MM-dd");Assertions.assertTrue(validator.isValid("2021-02-28"));Assertions.assertTrue(validator.isValid("2021-02-30"));}}

第二种:使用LocalDate检查

JDK8引入了更加好用的日期和时间API。其中包括LocalDate类,是一个不可变且线程安全的时间类。

1、定义时间校验器的接口

public interface DateValidator {boolean isValid(String dateStr);}

2、通过LocalDate的parse方法实现我们的校验器

import com.example.smile.result.configuration.DateValidator;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;public class DateValidatorUsingDateFormat implements DateValidator {private final DateTimeFormatter dateTimeFormatter;public DateValidatorUsingDateFormat(DateTimeFormatter dateTimeFormatter){this.dateTimeFormatter = dateTimeFormatter;}@Overridepublic boolean isValid(String dateStr) {try {LocalDate.parse(dateStr,this.dateTimeFormatter);}catch (DateTimeParseException e){return false;}return true;}
}

3、使用示例

java.time.format.DateTimeFormatter类是不可变的,也就是天然的线程安全,我们可以在不同线程使用同一个校验器实例。

import com.example.smile.result.configuration.DateValidator;
import com.example.smile.result.utils.DateValidatorUsingDateFormat;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;import java.time.format.DateTimeFormatter;@SpringBootTest
@Slf4j
public class DateValidatorUsingDateFormatTest {@Testvoid isValid(){final DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ISO_LOCAL_DATE;final DateValidator validator = new DateValidatorUsingDateFormat(dateTimeFormatter);Assertions.assertTrue(validator.isValid("2021-02-28"));Assertions.assertTrue(validator.isValid("2021-02-30"));}}

第三种:使用DateTimeFormatter检查

DateTimeFormatter解析文本总共分两步。第一步,根据配置将文本解析为日期和时间字段;第二步,用解析后的字段创建日期和时间对象

1、定义时间校验器的接口

public interface DateValidator {boolean isValid(String dateStr);}

2、实现验证器

import com.example.smile.result.configuration.DateValidator;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;public class DateValidatorUsingDateFormat implements DateValidator {private final DateTimeFormatter dateTimeFormatter;public DateValidatorUsingDateFormat(DateTimeFormatter dateTimeFormatter){this.dateTimeFormatter = dateTimeFormatter;}@Overridepublic boolean isValid(String dateStr) {try {LocalDate.parse(dateStr,this.dateTimeFormatter);}catch (DateTimeParseException e){return false;}return true;}
}

3、使用示例

import com.example.smile.result.configuration.DateValidator;
import com.example.smile.result.utils.DateValidatorUsingDateFormat;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import java.time.format.DateTimeFormatter;
import java.time.format.ResolverStyle;
import java.util.Locale;@SpringBootTest
@Slf4j
public class DateValidatorUsingDateFormatTest {private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("uuuu-MM-dd", Locale.CHINA);@Testvoid isValid(){final DateTimeFormatter dateTimeFormatter = DATE_FORMATTER.withResolverStyle(ResolverStyle.STRICT);final DateValidator validator = new DateValidatorUsingDateFormat(dateTimeFormatter);Assertions.assertTrue(validator.isValid("2021-02-28"));Assertions.assertTrue(validator.isValid("2021-02-30"));}}

可以看到,我们指定了转换模式是ResolverStyle.STRICT,这个类型是说明解析模型。共有三种:

1、STRICT:严格模式,日期、时间必须完全正确

2、SMART:智能模式,针对日可以自动调整。月的范围在 1 到 12,日的范围在 1 到 31。比如输入是 2 月 30 号,当年 2 月只有 28 天,返回的日期就是 2 月 28 日

3、LENIENT:宽松模式,主要针对月和日,会自动后延。结果类似于LocalData#plusDays或者LocalDate#plusMonths

示例如下:

import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
import java.time.format.ResolverStyle;
import java.util.Locale;@SpringBootTest
@Slf4j
public class DateValidatorUsingDateFormatTest {private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("uuuu-MM-dd", Locale.CHINA);private static LocalDate parseDate(String dateString, ResolverStyle resolverStyle) {try {return LocalDate.parse(dateString, DATE_FORMATTER.withResolverStyle(resolverStyle));} catch (DateTimeParseException e) {return null;}}@Testvoid testResolverStyle() {Assertions.assertEquals(LocalDate.of(2021, 2, 28), parseDate("2021-02-28", ResolverStyle.STRICT));Assertions.assertNull(parseDate("2021-02-29", ResolverStyle.STRICT));Assertions.assertEquals(LocalDate.of(2021, 2, 28), parseDate("2021-02-28", ResolverStyle.STRICT));Assertions.assertNull(parseDate("2021-13-28", ResolverStyle.STRICT));Assertions.assertEquals(LocalDate.of(2021, 2, 28), parseDate("2021-02-28", ResolverStyle.SMART));Assertions.assertEquals(LocalDate.of(2021, 2, 28), parseDate("2021-02-29", ResolverStyle.SMART));Assertions.assertNull(parseDate("2021-13-28", ResolverStyle.SMART));Assertions.assertNull(parseDate("2021-13-29", ResolverStyle.SMART));Assertions.assertEquals(LocalDate.of(2021, 2, 28), parseDate("2021-02-28", ResolverStyle.LENIENT));Assertions.assertEquals(LocalDate.of(2021, 3, 1), parseDate("2021-02-29", ResolverStyle.LENIENT));Assertions.assertEquals(LocalDate.of(2022, 1, 28), parseDate("2021-13-28", ResolverStyle.LENIENT));Assertions.assertEquals(LocalDate.of(2022, 2, 2), parseDate("2021-13-33", ResolverStyle.LENIENT));}
}

从例子可以看出,ResolverStyle.STRICT是严格控制,用来做时间校验比较合适;ResolverStyle.LENIENT可以最大程度将字符串转化为时间对象,在合理范围内可以随便玩;ResolverStyle.SMART名为智能,但智力有限,两不沾边,优势不够明显。JDK 提供的DateTimeFormatter实现,都是ResolverStyle.STRICT模式

第四种:Apache出品的commons-validator检查

Apache Commons项目提供了一个校验器框架,包含多种校验规则,包括日期、时间、数字、货币、IP地址、邮箱、URL地址等。

本文主要说检查时间,所以重点看GenericValidator类提供的isDate方法

1、添加依赖

        <dependency><groupId>commons-validator</groupId><artifactId>commons-validator</artifactId><version>1.7</version></dependency>

2、定义时间校验器的接口

public interface DateValidator {boolean isValid(String dateStr);}

3、实现验证器

import com.example.smile.result.configuration.DateValidator;
import org.apache.commons.validator.GenericValidator;public class DateValidatorUsingDateFormat implements DateValidator {private final String dateFormat;public DateValidatorUsingDateFormat(String dateFormat){this.dateFormat = dateFormat;}@Overridepublic boolean isValid(String dateStr) {return GenericValidator.isDate(dateStr,dateStr,true);}
}

4、使用示例

import com.example.smile.result.configuration.DateValidator;
import com.example.smile.result.utils.DateValidatorUsingDateFormat;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;@SpringBootTest
@Slf4j
public class DateValidatorUsingDateFormatTest {@Testvoid isValid(){final DateValidator dateValidator = new DateValidatorUsingDateFormat("yyyy-MM-dd");Assertions.assertTrue(dateValidator.isValid("2021-02-28"));Assertions.assertTrue(dateValidator.isValid("2021-02-30"));}}

在本文中,我们通过四种方式实现了时间字符串校验逻辑。其中DateFormatSimpleDataFormat是非线程安全的,所以每次方法调用时,都需要新建实例;apache.commons.validator.DateValidator#isValid它的内部也是通过DateFormatSimpleDateFormat实现的;而LocalDate和DateTimeFormatter则为JDK8中提供的实现方法。

检查字符串是否为合法的日期格式相关推荐

  1. 4 种方法!检查字符串是否为合法的日期格式

    哈喽大家好,今天咱们来讲一下,Java 中如何检查一个字符串是否是合法的日期格式? 为什么要检查时间格式? 后端接口在接收数据的时候,都需要进行检查.检查全部通过后,才能够执行业务逻辑.对于时间格式, ...

  2. Java如何将指定字符串转化为指定日期格式

    在做网络爬虫时,经常会发现不同平台中的时间格式是不同的.那么,如何将不同的平台中的时间转为为相同格式的时间,并将其保存到数据库中呢. 下面的程序,是列举了一个实例.根据传过来的日期字符串"形 ...

  3. js中判断字符串是否为合法的email格式

    /**  * 判断字符串emailAddr是否为合法的email格式  * 主要判断'@'及'.'是否出现,以及两者的位置  * @param emailAddr 输入的email地址  * @ret ...

  4. js中判断字符串是否为合法的email格式 1

    /** * 判断字符串emailAddr是否为合法的email格式 * 主要判断'@'及'.'是否出现,以及两者的位置 * @param emailAddr 输入的email地址 * @return ...

  5. python: 判断字符串是否为合法的json格式

    转自:https://blog.csdn.net/benben0729/article/details/80880180 在一些情况下,我们需要判断字符串是否为合法json格式. 思路很简单:尝试对字 ...

  6. java 带t日期格式转换_自我整理:java 日期转换

    1.获取特定日期格式的字符串,当前时间 SimpleDateFormat sm = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Dat ...

  7. js日期格式判断(2018/01/30) -方法 小时分秒格式判断((HH:MM)

    案例如下: //日期格式判斷         function lo_isDatePart(dateStr) {             var parts;             if (date ...

  8. oracle 正则表达式匹配日期格式,利用正则表达式找出不合符的日期

    很多时候我们的日期可能存放的是字符串类型,在插入的时候也很有可能插入的日期格式不正确, 因此我们需要找出这些不合符的日期格式,来此来修正.当然可以使用TO_DATE函数一个一个的转换来找出不合法的日期 ...

  9. python 判断字符串时是否是json格式方法

    在实际工作中,有时候需要对判断字符串是否为合法的json格式 解决方法使用json.loads,这样更加符合'Pythonic'写法 代码示例: Python import json def is_j ...

  10. initBinder转换日期格式

    @Controller public class FirstController {@RequestMapping("/first")//类型转化工作一定是在真正的handler方 ...

最新文章

  1. pve rust 能拆家吗_RUST:2020年9月第四周:向上向上再向上!
  2. OpenStack Newton发布,EasyStack核心代码贡献中国第一!
  3. ML之kNNC:基于iris莺尾花数据集(PCA处理+三维散点图可视化)利用kNN算法实现分类预测daiding
  4. 网络爬虫(urllib超详细使用指南)
  5. android 禁用dlsym_Android7.0对dlopen的改变——读取私有.so结果变化
  6. excel随机排序,在A列产生顺序号
  7. TypeScript入门-枚举
  8. smokeping安装方法及不出图解决办法
  9. 防止刷新重复post提交
  10. Mr.Jin系统发布报告——WIN7 WIN8双系统下的学习模式系统
  11. centos 安装 Vagrant
  12. 简单计算器代码(含加减乘除取余5个操作)
  13. 《DO圣堂刺客2》国服首测今天拉开
  14. Linux基础知识-命令行
  15. php十六进制转二进制,php 十六进制转化为二进制的代码
  16. PostMan中文参数乱码 row模式传参 Content-Type 中文乱码
  17. 向量组/矩阵/秩的理解
  18. 流失用户召回方法策略,教你如何挽回流失用户
  19. 蓝牙学习笔记之SMP协议(十四)
  20. 【加拿大访问学者】加拿大康考迪亚大学访问学者相关问题解答【魁北克及蒙特利尔地区必看Concordia University Visiting Scholars or Research Interns】

热门文章

  1. CTR预估:计算广告的应用(1)——理论
  2. OSPF路由器类型 ABR与ASBR路由聚合区别
  3. 【CNN+VIT】LocalViT: Bringing Locality to Vision Transformers
  4. USB-IF发布针对盲文点字显示器的HID标准
  5. 正点原子STM32(基于HAL库)2
  6. node.js+uni计算机毕设项目鲸落图书商城小程序LW(程序+小程序+LW)
  7. centos7连接WiFi,并设置开机自动连接WiFi
  8. Spring源码分析:Spring的循环依赖分析
  9. 4.各种动物英语表示
  10. 我的地盘ol位置服务器拒绝怎么办,微信我的地盘ol等级划分详解 微信我的地盘ol等级怎么分...