diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/Validator.java b/hutool-core/src/main/java/cn/hutool/core/lang/Validator.java index 368acb9a7..850ce1cdb 100755 --- a/hutool-core/src/main/java/cn/hutool/core/lang/Validator.java +++ b/hutool-core/src/main/java/cn/hutool/core/lang/Validator.java @@ -3,6 +3,7 @@ package cn.hutool.core.lang; import cn.hutool.core.date.DateUtil; import cn.hutool.core.exceptions.ValidateException; import cn.hutool.core.regex.PatternPool; +import cn.hutool.core.util.CharsetUtil; import cn.hutool.core.util.CreditCodeUtil; import cn.hutool.core.math.NumberUtil; import cn.hutool.core.util.ObjUtil; @@ -11,6 +12,8 @@ import cn.hutool.core.text.StrUtil; import cn.hutool.core.util.IdcardUtil; import java.net.MalformedURLException; +import java.nio.charset.Charset; +import java.util.Date; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -1046,6 +1049,29 @@ public class Validator { } } + /** + * 检查给定的日期是否在指定范围内 + * + * @param value 值 + * @param start 最小值(包含) + * @param end 最大值(包含) + * @param errorMsg 验证错误的信息 + * @throws ValidateException 验证异常 + * @author ZRH 455741807@qq.com + */ + public static void validateBetween(final Date value, final Date start, final Date end, final String errorMsg) { + Assert.notNull(value); + Assert.notNull(start); + Assert.notNull(end); + int c1 = DateUtil.compare(value, start); + int c2 = DateUtil.compare(value, end); + + if(c1 >= 0 && c2 <= 0){ + return; + } + throw new ValidateException(errorMsg); + } + /** * 是否是有效的统一社会信用代码 *
@@ -1160,4 +1186,46 @@ public class Validator { } return value; } + + /** + * 验证字符的长度是否符合要求 + * @param str 字符串 + * @param min 最小长度 + * @param max 最大长度 + * @param errorMsg 错误消息 + */ + public static void validateLength(CharSequence str, int min, int max, String errorMsg) { + int len = StrUtil.length(str); + if (len < min || len > max) { + throw new ValidateException(errorMsg); + } + } + + /** + * 验证字符串的字节长度是否符合要求,默认采用"utf-8"编码 + * + * @param str 字符串 + * @param min 最小长度 + * @param max 最大长度 + * @param errorMsg 错误消息 + */ + public static void validateByteLength(CharSequence str, int min, int max, String errorMsg) { + validateByteLength(str, min, max, CharsetUtil.UTF_8, errorMsg); + } + + /** + * 验证字符串的字节长度是否符合要求 + * + * @param str 字符串 + * @param min 最小长度 + * @param max 最大长度 + * @param charset 字符编码 + * @param errorMsg 错误消息 + */ + public static void validateByteLength(CharSequence str, int min, int max, Charset charset, String errorMsg) { + int len = StrUtil.byteLength(str, charset); + if (len < min || len > max) { + throw new ValidateException(errorMsg); + } + } } diff --git a/hutool-core/src/test/java/cn/hutool/core/lang/ValidatorTest.java b/hutool-core/src/test/java/cn/hutool/core/lang/ValidatorTest.java index 75fc1b53d..dab979e0a 100755 --- a/hutool-core/src/test/java/cn/hutool/core/lang/ValidatorTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/lang/ValidatorTest.java @@ -1,11 +1,16 @@ package cn.hutool.core.lang; +import cn.hutool.core.date.DateUtil; import cn.hutool.core.exceptions.ValidateException; import cn.hutool.core.lang.id.IdUtil; import cn.hutool.core.regex.PatternPool; +import cn.hutool.core.text.StrUtil; +import cn.hutool.core.util.CharsetUtil; import org.junit.Assert; import org.junit.Test; +import java.util.Date; + /** * 验证器单元测试 * @@ -248,6 +253,44 @@ public class ValidatorTest { Assert.assertTrue(Validator.isMatchRegex(PatternPool.URL_HTTP, content)); } + @Test + public void validateBetweenTest(){ + Date value = DateUtil.parse("2022-08-09 21:22:00"); + final Date start = DateUtil.parse("2022-08-01 21:22:00"); + final Date end = DateUtil.parse("2022-09-09 21:22:00"); + + Validator.validateBetween(value, start, end, "您选择的日期超出规定范围!"); + Assert.assertTrue(true); + + final Date value2 = DateUtil.parse("2023-08-09 21:22:00"); + Assert.assertThrows(ValidateException.class, ()-> + Validator.validateBetween(value2, start, end, "您选择的日期超出规定范围!") + ); + } + + @Test + public void validateLengthTest() { + String s1 = "abc"; + Assert.assertThrows(ValidateException.class, ()-> + Validator.validateLength(s1, 6, 8, "请输入6到8位的字符!")); + } + + @Test + public void validateByteLengthTest() { + String s1 = "abc"; + int len1 = StrUtil.byteLength(s1, CharsetUtil.UTF_8); + Assert.assertEquals(len1, 3); + + String s2 = "我ab"; + int len2 = StrUtil.byteLength(s2, CharsetUtil.UTF_8); + Assert.assertEquals(len2, 5); + + //一个汉字在utf-8编码下,占3个字节。 + Assert.assertThrows(ValidateException.class, ()-> + Validator.validateByteLength(s2, 1, 3, "您输入的字符串长度超出限制!") + ); + } + @Test public void isChineseNameTest(){ Assert.assertTrue(Validator.isChineseName("阿卜杜尼亚孜·毛力尼亚孜"));