CreatedAt     []time.Time          `form:"createdAt" time_format:"2006-01-02 15:04:05" example:"2019-09-09 12:12:12,2019-09-09 12:12:12"`

This code can get the value correctly in the post form, but cannot bind the data in http get query

http get:

&createdAt=2024-03-20%2000%3A00%3A00&createdAt=2024-03-20%2023%3A59%3A59

has error:

invalid character '-' after top-level value

Comment From: RedCrazyGhost

I've tried to reproduce your issue on my side

Can't reproduce your problem

test code:

package main

import (
    "net/http"
    "time"

    "github.com/gin-gonic/gin"
)

func main() {
    r := gin.Default()
    r.Any("/time", func(c *gin.Context) {
        s := struct {
            CreatedAt []time.Time `form:"createdAt" time_format:"2006-01-02 15:04:05" example:"2019-09-09 12:12:12,2019-09-09 12:12:12"`
        }{}

        if err := c.Bind(&s); err != nil {
            c.String(http.StatusBadRequest,err.Error())
        }
        c.JSON(http.StatusOK,s)

    })
    r.Run()
}

Comment From: appleboy

@RedCrazyGhost Thanks for your sample code.

@birdycn Please feel free to reopen the issue if you encounter the same problem.

Comment From: feiyangbeyond

@appleboy

I have a new type MyTime, and it has implements encoding/json.Unmarshaler.


const defaultTimeLayout = "2006-01-02 15:04:05"

type MyTime time.Time

func (t *MyTime) UnmarshalJSON(data []byte) error {
    var v interface{}
    if err := json.Unmarshal(data, &v); err != nil {
        return err
    }
    switch value := v.(type) {
    case string:
        var err error
        tt, err := time.ParseInLocation(defaultTimeLayout, value, time.Local)
        if err != nil {
            return err
        }
        *t = MyTime(tt)
        return nil
    default:
        return errors.New("invalid time format")
    }
}

func (t MyTime) MarshalJSON() ([]byte, error) {
    return json.Marshal(time.Time(t).Format(defaultTimeLayout))
}

And my struct define:

type MyReq struct {
    Time MyTime `json:"time" form:"time" binding:"required" time_format:"2006-01-02 15:04:05"`
}

When I use http get query , the same error occurred. And after changing MyReq.Time type to time.Time, it works.

I hope it works with MyTime