From 51b31495930598868beb1c448e04d847ceae4d27 Mon Sep 17 00:00:00 2001 From: cococolanosugar Date: Sat, 21 Mar 2026 09:07:49 +0800 Subject: [PATCH 1/3] fix(gvalid): date validation allows invalid formats like Y-MMMM and invalid dates like 2026-13-33 --- .../gvalid/gvalid_z_unit_feature_rule_test.go | 21 ++++++++++++------- util/gvalid/internal/builtin/builtin_date.go | 17 +++++++++------ 2 files changed, 24 insertions(+), 14 deletions(-) diff --git a/util/gvalid/gvalid_z_unit_feature_rule_test.go b/util/gvalid/gvalid_z_unit_feature_rule_test.go index da6f9489875..2cb8768e896 100755 --- a/util/gvalid/gvalid_z_unit_feature_rule_test.go +++ b/util/gvalid/gvalid_z_unit_feature_rule_test.go @@ -271,14 +271,19 @@ func Test_RequiredWithOutAll(t *testing.T) { func Test_Date(t *testing.T) { gtest.C(t, func(t *gtest.T) { m := g.MapStrBool{ - "2010": false, - "201011": false, - "20101101": true, - "2010-11-01": true, - "2010.11.01": true, - "2010/11/01": true, - "2010=11=01": false, - "123": false, + "2010": false, + "201011": false, + "20101101": true, + "2010-11-01": true, + "2010.11.01": true, + "2010/11/01": true, + "2010=11=01": false, + "123": false, + "2026-1111": false, // Bug: invalid format should not pass + "2026-13-33": false, // Bug: invalid date should not pass + "2026-02-29": false, // Non-leap year should not pass + "2024-02-29": true, // Leap year should pass + "202611-11": false, // Invalid separator should not pass } for k, v := range m { err := g.Validator().Data(k).Rules("date").Run(ctx) diff --git a/util/gvalid/internal/builtin/builtin_date.go b/util/gvalid/internal/builtin/builtin_date.go index d186bbd6422..0f737695e29 100644 --- a/util/gvalid/internal/builtin/builtin_date.go +++ b/util/gvalid/internal/builtin/builtin_date.go @@ -10,7 +10,7 @@ import ( "errors" "time" - "github.com/gogf/gf/v2/text/gregex" + "github.com/gogf/gf/v2/os/gtime" ) // RuleDate implements `date` rule: @@ -41,12 +41,17 @@ func (r RuleDate) Run(in RunInput) error { if obj.IsZero() { return errors.New(in.Message) } + return nil } - if !gregex.IsMatchString( - `\d{4}[\.\-\_/]{0,1}\d{2}[\.\-\_/]{0,1}\d{2}`, - in.Value.String(), - ) { - return errors.New(in.Message) + // Try direct time conversion for validation, which handles both format and date validity. + // Support common date formats: 2006-01-02, 20060102, 2006.01.02 + if _, err := gtime.StrToDateFormat(in.Value.String(), "Ymd"); err != nil { + // Try with separator formats + if _, err := gtime.StrToDateFormat(in.Value.String(), "Y-m-d"); err != nil { + if _, err := gtime.StrToDateFormat(in.Value.String(), "Y.m.d"); err != nil { + return errors.New(in.Message) + } + } } return nil } From 6d45dee71fc7d491b37fa97d8ad6f0a722baa859 Mon Sep 17 00:00:00 2001 From: cococolanosugar Date: Mon, 23 Mar 2026 10:30:41 +0800 Subject: [PATCH 2/3] fix(gvalid): support slash date format and fix function name mistake --- util/gvalid/internal/builtin/builtin_date.go | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/util/gvalid/internal/builtin/builtin_date.go b/util/gvalid/internal/builtin/builtin_date.go index 0f737695e29..eff0e9a9849 100644 --- a/util/gvalid/internal/builtin/builtin_date.go +++ b/util/gvalid/internal/builtin/builtin_date.go @@ -44,12 +44,14 @@ func (r RuleDate) Run(in RunInput) error { return nil } // Try direct time conversion for validation, which handles both format and date validity. - // Support common date formats: 2006-01-02, 20060102, 2006.01.02 - if _, err := gtime.StrToDateFormat(in.Value.String(), "Ymd"); err != nil { - // Try with separator formats - if _, err := gtime.StrToDateFormat(in.Value.String(), "Y-m-d"); err != nil { - if _, err := gtime.StrToDateFormat(in.Value.String(), "Y.m.d"); err != nil { - return errors.New(in.Message) + // Support common date formats: 2006-01-02, 20060102, 2006.01.02, 2006/01/02 + if _, err := gtime.StrToTimeFormat(in.Value.String(), "Ymd"); err != nil { + // Try with different separator formats + if _, err := gtime.StrToTimeFormat(in.Value.String(), "Y-m-d"); err != nil { + if _, err := gtime.StrToTimeFormat(in.Value.String(), "Y.m.d"); err != nil { + if _, err := gtime.StrToTimeFormat(in.Value.String(), "Y/m/d"); err != nil { + return errors.New(in.Message) + } } } } From 2d87e4543319ab4f103140694208c9584341dd8a Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 23 Mar 2026 02:32:54 +0000 Subject: [PATCH 3/3] Apply gci import order changes --- .../gvalid/gvalid_z_unit_feature_rule_test.go | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/util/gvalid/gvalid_z_unit_feature_rule_test.go b/util/gvalid/gvalid_z_unit_feature_rule_test.go index 2cb8768e896..f77e9afce1c 100755 --- a/util/gvalid/gvalid_z_unit_feature_rule_test.go +++ b/util/gvalid/gvalid_z_unit_feature_rule_test.go @@ -271,19 +271,19 @@ func Test_RequiredWithOutAll(t *testing.T) { func Test_Date(t *testing.T) { gtest.C(t, func(t *gtest.T) { m := g.MapStrBool{ - "2010": false, - "201011": false, - "20101101": true, - "2010-11-01": true, - "2010.11.01": true, - "2010/11/01": true, - "2010=11=01": false, - "123": false, - "2026-1111": false, // Bug: invalid format should not pass - "2026-13-33": false, // Bug: invalid date should not pass - "2026-02-29": false, // Non-leap year should not pass - "2024-02-29": true, // Leap year should pass - "202611-11": false, // Invalid separator should not pass + "2010": false, + "201011": false, + "20101101": true, + "2010-11-01": true, + "2010.11.01": true, + "2010/11/01": true, + "2010=11=01": false, + "123": false, + "2026-1111": false, // Bug: invalid format should not pass + "2026-13-33": false, // Bug: invalid date should not pass + "2026-02-29": false, // Non-leap year should not pass + "2024-02-29": true, // Leap year should pass + "202611-11": false, // Invalid separator should not pass } for k, v := range m { err := g.Validator().Data(k).Rules("date").Run(ctx)