You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
59 lines
1.3 KiB
59 lines
1.3 KiB
package time |
|
|
|
import ( |
|
"context" |
|
"database/sql/driver" |
|
"strconv" |
|
xtime "time" |
|
) |
|
|
|
// Time be used to MySql timestamp converting. |
|
type Time int64 |
|
|
|
// Scan scan time. |
|
func (jt *Time) Scan(src interface{}) (err error) { |
|
switch sc := src.(type) { |
|
case xtime.Time: |
|
*jt = Time(sc.Unix()) |
|
case string: |
|
var i int64 |
|
i, err = strconv.ParseInt(sc, 10, 64) |
|
*jt = Time(i) |
|
} |
|
return |
|
} |
|
|
|
// Value get time value. |
|
func (jt Time) Value() (driver.Value, error) { |
|
return xtime.Unix(int64(jt), 0), nil |
|
} |
|
|
|
// Time get time. |
|
func (jt Time) Time() xtime.Time { |
|
return xtime.Unix(int64(jt), 0) |
|
} |
|
|
|
// Duration be used toml unmarshal string time, like 1s, 500ms. |
|
type Duration xtime.Duration |
|
|
|
// UnmarshalText unmarshal text to duration. |
|
func (d *Duration) UnmarshalText(text []byte) error { |
|
tmp, err := xtime.ParseDuration(string(text)) |
|
if err == nil { |
|
*d = Duration(tmp) |
|
} |
|
return err |
|
} |
|
|
|
// Shrink will decrease the duration by comparing with context's timeout duration |
|
// and return new timeout\context\CancelFunc. |
|
func (d Duration) Shrink(c context.Context) (Duration, context.Context, context.CancelFunc) { |
|
if deadline, ok := c.Deadline(); ok { |
|
if ctimeout := xtime.Until(deadline); ctimeout < xtime.Duration(d) { |
|
// deliver small timeout |
|
return Duration(ctimeout), c, func() {} |
|
} |
|
} |
|
ctx, cancel := context.WithTimeout(c, xtime.Duration(d)) |
|
return d, ctx, cancel |
|
}
|
|
|