()
| 75 | } |
| 76 | |
| 77 | func (d *Decoder) DecodeTime() (time.Time, error) { |
| 78 | c, err := d.readCode() |
| 79 | if err != nil { |
| 80 | return time.Time{}, err |
| 81 | } |
| 82 | |
| 83 | // Legacy format. |
| 84 | if c == msgpcode.FixedArrayLow|2 { |
| 85 | sec, err := d.DecodeInt64() |
| 86 | if err != nil { |
| 87 | return time.Time{}, err |
| 88 | } |
| 89 | |
| 90 | nsec, err := d.DecodeInt64() |
| 91 | if err != nil { |
| 92 | return time.Time{}, err |
| 93 | } |
| 94 | |
| 95 | return time.Unix(sec, nsec), nil |
| 96 | } |
| 97 | |
| 98 | if msgpcode.IsString(c) { |
| 99 | s, err := d.string(c) |
| 100 | if err != nil { |
| 101 | return time.Time{}, err |
| 102 | } |
| 103 | return time.Parse(time.RFC3339Nano, s) |
| 104 | } |
| 105 | |
| 106 | extID, extLen, err := d.extHeader(c) |
| 107 | if err != nil { |
| 108 | return time.Time{}, err |
| 109 | } |
| 110 | |
| 111 | // NodeJS seems to use extID 13. |
| 112 | if extID != timeExtID && extID != 13 { |
| 113 | return time.Time{}, fmt.Errorf("msgpack: invalid time ext id=%d", extID) |
| 114 | } |
| 115 | |
| 116 | tm, err := d.decodeTime(extLen) |
| 117 | if err != nil { |
| 118 | return tm, err |
| 119 | } |
| 120 | |
| 121 | if tm.IsZero() { |
| 122 | // Zero time does not have timezone information. |
| 123 | return tm.UTC(), nil |
| 124 | } |
| 125 | return tm, nil |
| 126 | } |
| 127 | |
| 128 | func (d *Decoder) decodeTime(extLen int) (time.Time, error) { |
| 129 | b, err := d.readN(extLen) |
no test coverage detected