Skip to content

Commit 4ccfa7c

Browse files
authored
feat(binding): add support for unixMilli and unixMicro (#4190)
1 parent 90cf460 commit 4ccfa7c

File tree

3 files changed

+32
-16
lines changed

3 files changed

+32
-16
lines changed

binding/binding_test.go

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -69,15 +69,19 @@ type FooStructDisallowUnknownFields struct {
6969
}
7070

7171
type FooBarStructForTimeType struct {
72-
TimeFoo time.Time `form:"time_foo" time_format:"2006-01-02" time_utc:"1" time_location:"Asia/Chongqing"`
73-
TimeBar time.Time `form:"time_bar" time_format:"2006-01-02" time_utc:"1"`
74-
CreateTime time.Time `form:"createTime" time_format:"unixNano"`
75-
UnixTime time.Time `form:"unixTime" time_format:"unix"`
72+
TimeFoo time.Time `form:"time_foo" time_format:"2006-01-02" time_utc:"1" time_location:"Asia/Chongqing"`
73+
TimeBar time.Time `form:"time_bar" time_format:"2006-01-02" time_utc:"1"`
74+
CreateTime time.Time `form:"createTime" time_format:"unixNano"`
75+
UnixTime time.Time `form:"unixTime" time_format:"unix"`
76+
UnixMilliTime time.Time `form:"unixMilliTime" time_format:"unixmilli"`
77+
UnixMicroTime time.Time `form:"unixMicroTime" time_format:"uNiXmiCrO"`
7678
}
7779

7880
type FooStructForTimeTypeNotUnixFormat struct {
79-
CreateTime time.Time `form:"createTime" time_format:"unixNano"`
80-
UnixTime time.Time `form:"unixTime" time_format:"unix"`
81+
CreateTime time.Time `form:"createTime" time_format:"unixNano"`
82+
UnixTime time.Time `form:"unixTime" time_format:"unix"`
83+
UnixMilliTime time.Time `form:"unixMilliTime" time_format:"unixMilli"`
84+
UnixMicroTime time.Time `form:"unixMicroTime" time_format:"unixMicro"`
8185
}
8286

8387
type FooStructForTimeTypeNotFormat struct {
@@ -265,10 +269,10 @@ func TestBindingFormDefaultValue2(t *testing.T) {
265269
func TestBindingFormForTime(t *testing.T) {
266270
testFormBindingForTime(t, http.MethodPost,
267271
"/", "/",
268-
"time_foo=2017-11-15&time_bar=&createTime=1562400033000000123&unixTime=1562400033", "bar2=foo")
272+
"time_foo=2017-11-15&time_bar=&createTime=1562400033000000123&unixTime=1562400033&unixMilliTime=1562400033001&unixMicroTime=1562400033000012", "bar2=foo")
269273
testFormBindingForTimeNotUnixFormat(t, http.MethodPost,
270274
"/", "/",
271-
"time_foo=2017-11-15&createTime=bad&unixTime=bad", "bar2=foo")
275+
"time_foo=2017-11-15&createTime=bad&unixTime=bad&unixMilliTime=bad&unixMicroTime=bad", "bar2=foo")
272276
testFormBindingForTimeNotFormat(t, http.MethodPost,
273277
"/", "/",
274278
"time_foo=2017-11-15", "bar2=foo")
@@ -282,11 +286,11 @@ func TestBindingFormForTime(t *testing.T) {
282286

283287
func TestBindingFormForTime2(t *testing.T) {
284288
testFormBindingForTime(t, http.MethodGet,
285-
"/?time_foo=2017-11-15&time_bar=&createTime=1562400033000000123&unixTime=1562400033", "/?bar2=foo",
289+
"/?time_foo=2017-11-15&time_bar=&createTime=1562400033000000123&unixTime=1562400033&unixMilliTime=1562400033001&unixMicroTime=1562400033000012", "/?bar2=foo",
286290
"", "")
287291
testFormBindingForTimeNotUnixFormat(t, http.MethodPost,
288292
"/", "/",
289-
"time_foo=2017-11-15&createTime=bad&unixTime=bad", "bar2=foo")
293+
"time_foo=2017-11-15&createTime=bad&unixTime=bad&unixMilliTime=bad&unixMicroTime=bad", "bar2=foo")
290294
testFormBindingForTimeNotFormat(t, http.MethodGet,
291295
"/?time_foo=2017-11-15", "/?bar2=foo",
292296
"", "")
@@ -952,6 +956,8 @@ func testFormBindingForTime(t *testing.T, method, path, badPath, body, badBody s
952956
assert.Equal(t, "UTC", obj.TimeBar.Location().String())
953957
assert.Equal(t, int64(1562400033000000123), obj.CreateTime.UnixNano())
954958
assert.Equal(t, int64(1562400033), obj.UnixTime.Unix())
959+
assert.Equal(t, int64(1562400033001), obj.UnixMilliTime.UnixMilli())
960+
assert.Equal(t, int64(1562400033000012), obj.UnixMicroTime.UnixMicro())
955961

956962
obj = FooBarStructForTimeType{}
957963
req = requestWithBody(method, badPath, badBody)

binding/form_mapping.go

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -398,18 +398,24 @@ func setTimeField(val string, structField reflect.StructField, value reflect.Val
398398
}
399399

400400
switch tf := strings.ToLower(timeFormat); tf {
401-
case "unix", "unixnano":
401+
case "unix", "unixmilli", "unixmicro", "unixnano":
402402
tv, err := strconv.ParseInt(val, 10, 64)
403403
if err != nil {
404404
return err
405405
}
406406

407-
d := time.Duration(1)
408-
if tf == "unixnano" {
409-
d = time.Second
407+
var t time.Time
408+
switch tf {
409+
case "unix":
410+
t = time.Unix(tv, 0)
411+
case "unixmilli":
412+
t = time.UnixMilli(tv)
413+
case "unixmicro":
414+
t = time.UnixMicro(tv)
415+
default:
416+
t = time.Unix(0, tv)
410417
}
411418

412-
t := time.Unix(tv/int64(d), tv%int64(d))
413419
value.Set(reflect.ValueOf(t))
414420
return nil
415421
}

docs/doc.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -832,6 +832,8 @@ type Person struct {
832832
Birthday time.Time `form:"birthday" time_format:"2006-01-02" time_utc:"1"`
833833
CreateTime time.Time `form:"createTime" time_format:"unixNano"`
834834
UnixTime time.Time `form:"unixTime" time_format:"unix"`
835+
UnixMilliTime time.Time `form:"unixMilliTime" time_format:"unixmilli"`
836+
UnixMicroTime time.Time `form:"unixMicroTime" time_format:"uNiXmIcRo"` // case does not matter for "unix*" time formats
835837
}
836838

837839
func main() {
@@ -851,6 +853,8 @@ func startPage(c *gin.Context) {
851853
log.Println(person.Birthday)
852854
log.Println(person.CreateTime)
853855
log.Println(person.UnixTime)
856+
log.Println(person.UnixMilliTime)
857+
log.Println(person.UnixMicroTime)
854858
}
855859

856860
c.String(http.StatusOK, "Success")
@@ -860,7 +864,7 @@ func startPage(c *gin.Context) {
860864
Test it with:
861865

862866
```sh
863-
curl -X GET "localhost:8085/testing?name=appleboy&address=xyz&birthday=1992-03-15&createTime=1562400033000000123&unixTime=1562400033"
867+
curl -X GET "localhost:8085/testing?name=appleboy&address=xyz&birthday=1992-03-15&createTime=1562400033000000123&unixTime=1562400033&unixMilliTime=1562400033001&unixMicroTime=1562400033000012"
864868
```
865869

866870

0 commit comments

Comments
 (0)