Golang如何将字符串("1994-01-06")转换为纯日期格式?
Golang如何将字符串(“1994-01-06”)转换为纯日期格式? 在转换日期时,我无法匹配布局字符串。
当请求到达API时,我从处理程序获取数据(从Postman传来的date_of_birth为:“2001-02-02”),并将其分配给User结构体。我想在数据分配后进行验证。当将DateOfBirth分配给结构体时,我执行FormatDate函数以将字符串格式化为时间。格式化后,其值为:“2002-02-02 00:00:00 +0000 UTC”。
现在,在Ozzo验证中,validation.Date(layout string)方法期望的布局与"2002-02-02 00:00:00 +0000 UTC"相同,但我不知道这个布局是什么。如何匹配这两个布局?
func FormatDate(date string) time.Time {
time1, err := time.Parse("2006-01-02", date)
if err != nil {
fmt.Println("Error while parsing date :", err)
}
return time1
}
type User struct {
Id string `json:"id"`
FirstName string `json:"first_name"`
LastName string `json:"last_name"`
Email string `json:"email"`
Password string `json:"password"`
DateOfBirth time.Time `json:"date_of_birth"`
}
func (u User) Validate() error {
fmt.Println("Date is", &u.DateOfBirth)
return validation.ValidateStruct(&u,
validation.Field(&u.FirstName, validation.Required, validation.Length(3, 40)),
validation.Field(&u.LastName, validation.Required, validation.Length(3, 40)),
validation.Field(&u.Email, validation.Required, is.Email),
validation.Field(&u.DateOfBirth, validation.Required, validation.Date("2006-01-02").Min(time.Date(1999, time.Month(2), 22, 0, 0, 0, 0, time.UTC))),
)
}
更多关于Golang如何将字符串("1994-01-06")转换为纯日期格式?的实战教程也可以访问 https://www.itying.com/category-94-b0.html
不太确定。但你试过这个吗?
validation.Field(&u.DateOfBirth, validation.Required, validation.Date("2002-02-02 00:00:00 +0000 UTC").Min(time.Date(1999, time.Month(2), 22, 0, 0, 0, 0, time.UTC))),
编辑:我认为你应该验证 string 类型,而不是 time.Time。
参考:ozzo-validation/date.go at 34bd5476bd5bb4884aee8252974da4cd4e878a75 · go-ozzo/ozzo-validation · GitHub
更多关于Golang如何将字符串("1994-01-06")转换为纯日期格式?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
在Ozzo验证中,validation.Date()方法期望的布局字符串需要与Go的标准时间格式匹配。你当前的时间值"2002-02-02 00:00:00 +0000 UTC"对应的布局是"2006-01-02 15:04:05 -0700 MST"。
以下是修正后的验证代码:
func (u User) Validate() error {
fmt.Println("Date is", u.DateOfBirth)
return validation.ValidateStruct(&u,
validation.Field(&u.FirstName, validation.Required, validation.Length(3, 40)),
validation.Field(&u.LastName, validation.Required, validation.Length(3, 40)),
validation.Field(&u.Email, validation.Required, is.Email),
validation.Field(&u.DateOfBirth, validation.Required,
validation.Date("2006-01-02 15:04:05 -0700 MST").
Min(time.Date(1999, time.Month(2), 22, 0, 0, 0, 0, time.UTC))),
)
}
如果你只想验证日期部分而不关心时间,可以先将时间转换为纯日期格式:
func (u User) Validate() error {
// 提取日期部分进行验证
dateOnly := u.DateOfBirth.Format("2006-01-02")
return validation.ValidateStruct(&u,
validation.Field(&u.FirstName, validation.Required, validation.Length(3, 40)),
validation.Field(&u.LastName, validation.Required, validation.Length(3, 40)),
validation.Field(&u.Email, validation.Required, is.Email),
validation.Field(&dateOnly, validation.Required,
validation.Date("2006-01-02").
Min("1999-02-22")),
)
}
或者使用自定义验证函数:
func (u User) Validate() error {
return validation.ValidateStruct(&u,
validation.Field(&u.FirstName, validation.Required, validation.Length(3, 40)),
validation.Field(&u.LastName, validation.Required, validation.Length(3, 40)),
validation.Field(&u.Email, validation.Required, is.Email),
validation.Field(&u.DateOfBirth, validation.Required,
validation.By(func(value interface{}) error {
t, ok := value.(time.Time)
if !ok {
return validation.NewError("validation_date", "must be a valid date")
}
// 检查是否在最小日期之后
minDate := time.Date(1999, 2, 22, 0, 0, 0, 0, time.UTC)
if t.Before(minDate) {
return validation.NewError("validation_date", "date must be after 1999-02-22")
}
return nil
})),
)
}
如果你希望保持原始字符串格式进行验证,可以在解析时直接使用字符串验证:
type User struct {
Id string `json:"id"`
FirstName string `json:"first_name"`
LastName string `json:"last_name"`
Email string `json:"email"`
Password string `json:"password"`
DateOfBirth string `json:"date_of_birth"`
}
func (u User) Validate() error {
return validation.ValidateStruct(&u,
validation.Field(&u.FirstName, validation.Required, validation.Length(3, 40)),
validation.Field(&u.LastName, validation.Required, validation.Length(3, 40)),
validation.Field(&u.Email, validation.Required, is.Email),
validation.Field(&u.DateOfBirth, validation.Required,
validation.Date("2006-01-02").
Min("1999-02-22")),
)
}

