1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 |
- 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
- }
|