9 "github.com/vmihailenco/msgpack/codes"
12 var timeExtId int8 = -1
15 timeType := reflect.TypeOf((*time.Time)(nil)).Elem()
16 registerExt(timeExtId, timeType, encodeTimeValue, decodeTimeValue)
19 func (e *Encoder) EncodeTime(tm time.Time) error {
21 if err := e.encodeExtLen(len(b)); err != nil {
24 if err := e.w.WriteByte(byte(timeExtId)); err != nil {
30 func (e *Encoder) encodeTime(tm time.Time) []byte {
31 secs := uint64(tm.Unix())
33 data := uint64(tm.Nanosecond())<<34 | secs
34 if data&0xffffffff00000000 == 0 {
36 binary.BigEndian.PutUint32(b, uint32(data))
40 binary.BigEndian.PutUint64(b, data)
46 binary.BigEndian.PutUint32(b, uint32(tm.Nanosecond()))
47 binary.BigEndian.PutUint64(b[4:], uint64(secs))
51 func (d *Decoder) DecodeTime() (time.Time, error) {
52 tm, err := d.decodeTime()
58 // Assume that zero time does not have timezone information.
64 func (d *Decoder) decodeTime() (time.Time, error) {
68 c, err := d.readCode()
70 return time.Time{}, err
74 if c == codes.FixedArrayLow|2 {
75 sec, err := d.DecodeInt64()
77 return time.Time{}, err
80 nsec, err := d.DecodeInt64()
82 return time.Time{}, err
85 return time.Unix(sec, nsec), nil
88 if codes.IsString(c) {
91 return time.Time{}, err
93 return time.Parse(time.RFC3339Nano, s)
96 extLen, err = d.parseExtLen(c)
98 return time.Time{}, err
102 _, err = d.s.ReadByte()
104 return time.Time{}, nil
108 b, err := d.readN(extLen)
110 return time.Time{}, err
115 sec := binary.BigEndian.Uint32(b)
116 return time.Unix(int64(sec), 0), nil
118 sec := binary.BigEndian.Uint64(b)
119 nsec := int64(sec >> 34)
120 sec &= 0x00000003ffffffff
121 return time.Unix(int64(sec), nsec), nil
123 nsec := binary.BigEndian.Uint32(b)
124 sec := binary.BigEndian.Uint64(b[4:])
125 return time.Unix(int64(sec), int64(nsec)), nil
127 err = fmt.Errorf("msgpack: invalid ext len=%d decoding time", extLen)
128 return time.Time{}, err
132 func encodeTimeValue(e *Encoder, v reflect.Value) error {
133 tm := v.Interface().(time.Time)
134 b := e.encodeTime(tm)
138 func decodeTimeValue(d *Decoder, v reflect.Value) error {
139 tm, err := d.DecodeTime()
143 v.Set(reflect.ValueOf(tm))