diff --git a/binding/binding_test.go b/binding/binding_test.go index 5575e166..da71186a 100644 --- a/binding/binding_test.go +++ b/binding/binding_test.go @@ -9,6 +9,7 @@ import ( "mime/multipart" "net/http" "testing" + "time" "github.com/gin-gonic/gin/binding/example" "github.com/golang/protobuf/proto" @@ -284,3 +285,14 @@ func requestWithBody(method, path, body string) (req *http.Request) { req, _ = http.NewRequest(method, path, bytes.NewBufferString(body)) return } + +func TestBindingFormOptionalTimeFormat(t *testing.T) { + q := struct { + Date time.Time `form:"date"` + }{} + req, _ := http.NewRequest(http.MethodGet, "/?date=2017-07-20", nil) + b := Form + err := b.Bind(req, &q) + assert.NoError(t, err) + assert.Equal(t, time.Date(2017, time.July, 20, 0, 0, 0, 0, time.Local), q.Date) +} diff --git a/binding/form_mapping.go b/binding/form_mapping.go index 34f12678..9e246508 100644 --- a/binding/form_mapping.go +++ b/binding/form_mapping.go @@ -9,6 +9,8 @@ import ( "reflect" "strconv" "time" + + "github.com/araddon/dateparse" ) func mapForm(ptr interface{}, form map[string][]string) error { @@ -148,22 +150,29 @@ func setFloatField(val string, bitSize int, field reflect.Value) error { } func setTimeField(val string, structField reflect.StructField, value reflect.Value) error { - timeFormat := structField.Tag.Get("time_format") - if timeFormat == "" { - return errors.New("Blank time format") - } if val == "" { value.Set(reflect.ValueOf(time.Time{})) return nil } + timeFormat := structField.Tag.Get("time_format") + l := time.Local if isUTC, _ := strconv.ParseBool(structField.Tag.Get("time_utc")); isUTC { l = time.UTC } - t, err := time.ParseInLocation(timeFormat, val, l) + var t time.Time + var err error + switch timeFormat { + case "": + t, err = dateparse.ParseIn(val, l) + default: + t, err = time.ParseInLocation(timeFormat, val, l) + + } + if err != nil { return err } diff --git a/vendor/vendor.json b/vendor/vendor.json index e8690a2c..bdfb91f2 100644 --- a/vendor/vendor.json +++ b/vendor/vendor.json @@ -2,6 +2,12 @@ "comment": "v1.2", "ignore": "test", "package": [ + { + "checksumSHA1": "5P/i6wl4VszvH+3ep0egh4C/BDM=", + "path": "github.com/araddon/dateparse", + "revision": "a1537bb04470047339734bb11c0403cbc41c31aa", + "revisionTime": "2017-07-27T05:39:44Z" + }, { "checksumSHA1": "dvabztWVQX8f6oMLRyv4dLH+TGY=", "comment": "v1.1.0",