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

2 回复

不太确定。但你试过这个吗?

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")),
    )
}
回到顶部