mirror of
https://github.com/gin-gonic/gin.git
synced 2025-10-17 14:12:16 +08:00
feat(binding): add support for unixMilli and unixMicro
This commit is contained in:
parent
499edccfea
commit
008e4c7ec1
@ -69,15 +69,19 @@ type FooStructDisallowUnknownFields struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type FooBarStructForTimeType struct {
|
type FooBarStructForTimeType struct {
|
||||||
TimeFoo time.Time `form:"time_foo" time_format:"2006-01-02" time_utc:"1" time_location:"Asia/Chongqing"`
|
TimeFoo time.Time `form:"time_foo" time_format:"2006-01-02" time_utc:"1" time_location:"Asia/Chongqing"`
|
||||||
TimeBar time.Time `form:"time_bar" time_format:"2006-01-02" time_utc:"1"`
|
TimeBar time.Time `form:"time_bar" time_format:"2006-01-02" time_utc:"1"`
|
||||||
CreateTime time.Time `form:"createTime" time_format:"unixNano"`
|
CreateTime time.Time `form:"createTime" time_format:"unixNano"`
|
||||||
UnixTime time.Time `form:"unixTime" time_format:"unix"`
|
UnixTime time.Time `form:"unixTime" time_format:"unix"`
|
||||||
|
UnixMilliTime time.Time `form:"unixMilliTime" time_format:"unixMilli"`
|
||||||
|
UnixMicroTime time.Time `form:"unixMicroTime" time_format:"unixMicro"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type FooStructForTimeTypeNotUnixFormat struct {
|
type FooStructForTimeTypeNotUnixFormat struct {
|
||||||
CreateTime time.Time `form:"createTime" time_format:"unixNano"`
|
CreateTime time.Time `form:"createTime" time_format:"unixNano"`
|
||||||
UnixTime time.Time `form:"unixTime" time_format:"unix"`
|
UnixTime time.Time `form:"unixTime" time_format:"unix"`
|
||||||
|
UnixMilliTime time.Time `form:"unixMilliTime" time_format:"unixMilli"`
|
||||||
|
UnixMicroTime time.Time `form:"unixMicroTime" time_format:"unixMicro"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type FooStructForTimeTypeNotFormat struct {
|
type FooStructForTimeTypeNotFormat struct {
|
||||||
@ -263,10 +267,10 @@ func TestBindingFormDefaultValue2(t *testing.T) {
|
|||||||
func TestBindingFormForTime(t *testing.T) {
|
func TestBindingFormForTime(t *testing.T) {
|
||||||
testFormBindingForTime(t, "POST",
|
testFormBindingForTime(t, "POST",
|
||||||
"/", "/",
|
"/", "/",
|
||||||
"time_foo=2017-11-15&time_bar=&createTime=1562400033000000123&unixTime=1562400033", "bar2=foo")
|
"time_foo=2017-11-15&time_bar=&createTime=1562400033000000123&unixTime=1562400033&unixMilliTime=1562400033001&unixMicroTime=1562400033000012", "bar2=foo")
|
||||||
testFormBindingForTimeNotUnixFormat(t, "POST",
|
testFormBindingForTimeNotUnixFormat(t, "POST",
|
||||||
"/", "/",
|
"/", "/",
|
||||||
"time_foo=2017-11-15&createTime=bad&unixTime=bad", "bar2=foo")
|
"time_foo=2017-11-15&createTime=bad&unixTime=bad&unixMilliTime=bad&unixMicroTime=bad", "bar2=foo")
|
||||||
testFormBindingForTimeNotFormat(t, "POST",
|
testFormBindingForTimeNotFormat(t, "POST",
|
||||||
"/", "/",
|
"/", "/",
|
||||||
"time_foo=2017-11-15", "bar2=foo")
|
"time_foo=2017-11-15", "bar2=foo")
|
||||||
@ -280,11 +284,11 @@ func TestBindingFormForTime(t *testing.T) {
|
|||||||
|
|
||||||
func TestBindingFormForTime2(t *testing.T) {
|
func TestBindingFormForTime2(t *testing.T) {
|
||||||
testFormBindingForTime(t, "GET",
|
testFormBindingForTime(t, "GET",
|
||||||
"/?time_foo=2017-11-15&time_bar=&createTime=1562400033000000123&unixTime=1562400033", "/?bar2=foo",
|
"/?time_foo=2017-11-15&time_bar=&createTime=1562400033000000123&unixTime=1562400033&unixMilliTime=1562400033001&unixMicroTime=1562400033000012", "/?bar2=foo",
|
||||||
"", "")
|
"", "")
|
||||||
testFormBindingForTimeNotUnixFormat(t, "POST",
|
testFormBindingForTimeNotUnixFormat(t, "POST",
|
||||||
"/", "/",
|
"/", "/",
|
||||||
"time_foo=2017-11-15&createTime=bad&unixTime=bad", "bar2=foo")
|
"time_foo=2017-11-15&createTime=bad&unixTime=bad&unixMilliTime=bad&unixMicroTime=bad", "bar2=foo")
|
||||||
testFormBindingForTimeNotFormat(t, "GET",
|
testFormBindingForTimeNotFormat(t, "GET",
|
||||||
"/?time_foo=2017-11-15", "/?bar2=foo",
|
"/?time_foo=2017-11-15", "/?bar2=foo",
|
||||||
"", "")
|
"", "")
|
||||||
@ -950,6 +954,8 @@ func testFormBindingForTime(t *testing.T, method, path, badPath, body, badBody s
|
|||||||
assert.Equal(t, "UTC", obj.TimeBar.Location().String())
|
assert.Equal(t, "UTC", obj.TimeBar.Location().String())
|
||||||
assert.Equal(t, int64(1562400033000000123), obj.CreateTime.UnixNano())
|
assert.Equal(t, int64(1562400033000000123), obj.CreateTime.UnixNano())
|
||||||
assert.Equal(t, int64(1562400033), obj.UnixTime.Unix())
|
assert.Equal(t, int64(1562400033), obj.UnixTime.Unix())
|
||||||
|
assert.Equal(t, int64(1562400033001), obj.UnixMilliTime.UnixNano()/1e6)
|
||||||
|
assert.Equal(t, int64(1562400033000012), obj.UnixMicroTime.UnixNano()/1e3)
|
||||||
|
|
||||||
obj = FooBarStructForTimeType{}
|
obj = FooBarStructForTimeType{}
|
||||||
req = requestWithBody(method, badPath, badBody)
|
req = requestWithBody(method, badPath, badBody)
|
||||||
|
@ -296,15 +296,20 @@ func setTimeField(val string, structField reflect.StructField, value reflect.Val
|
|||||||
}
|
}
|
||||||
|
|
||||||
switch tf := strings.ToLower(timeFormat); tf {
|
switch tf := strings.ToLower(timeFormat); tf {
|
||||||
case "unix", "unixnano":
|
case "unix", "unixmilli", "unixmicro", "unixnano":
|
||||||
tv, err := strconv.ParseInt(val, 10, 64)
|
tv, err := strconv.ParseInt(val, 10, 64)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
t := time.Unix(0, tv)
|
t := time.Unix(0, tv)
|
||||||
if tf == "unix" {
|
switch tf {
|
||||||
|
case "unix":
|
||||||
t = time.Unix(tv, 0)
|
t = time.Unix(tv, 0)
|
||||||
|
case "unixmilli":
|
||||||
|
t = time.Unix(tv/1e3, (tv%1e3)*1e6)
|
||||||
|
case "unixmicro":
|
||||||
|
t = time.Unix(tv/1e6, (tv%1e6)*1e3)
|
||||||
}
|
}
|
||||||
|
|
||||||
value.Set(reflect.ValueOf(t))
|
value.Set(reflect.ValueOf(t))
|
||||||
|
Loading…
x
Reference in New Issue
Block a user