ReadTime reads a time.Time object from the reader. The returned time's location will be set to time.Local.
()
| 1403 | // ReadTime reads a time.Time object from the reader. |
| 1404 | // The returned time's location will be set to time.Local. |
| 1405 | func (m *Reader) ReadTime() (t time.Time, err error) { |
| 1406 | offset, length, extType, err := m.peekExtensionHeader() |
| 1407 | if err != nil { |
| 1408 | return t, err |
| 1409 | } |
| 1410 | |
| 1411 | switch extType { |
| 1412 | case TimeExtension: |
| 1413 | var p []byte |
| 1414 | p, err = m.R.Peek(15) |
| 1415 | if err != nil { |
| 1416 | return |
| 1417 | } |
| 1418 | if p[0] != mext8 || p[1] != 12 { |
| 1419 | err = badPrefix(TimeType, p[0]) |
| 1420 | return |
| 1421 | } |
| 1422 | if int8(p[2]) != TimeExtension { |
| 1423 | err = errExt(int8(p[2]), TimeExtension) |
| 1424 | return |
| 1425 | } |
| 1426 | sec, nsec := getUnix(p[3:]) |
| 1427 | t = time.Unix(sec, int64(nsec)).Local() |
| 1428 | _, err = m.R.Skip(15) |
| 1429 | return |
| 1430 | case MsgTimeExtension: |
| 1431 | switch length { |
| 1432 | case 4, 8, 12: |
| 1433 | var tmp [12]byte |
| 1434 | _, err = m.R.Skip(offset) |
| 1435 | if err != nil { |
| 1436 | return |
| 1437 | } |
| 1438 | var n int |
| 1439 | n, err = m.R.Read(tmp[:length]) |
| 1440 | if err != nil { |
| 1441 | return |
| 1442 | } |
| 1443 | if n != length { |
| 1444 | err = ErrShortBytes |
| 1445 | return |
| 1446 | } |
| 1447 | b := tmp[:length] |
| 1448 | switch length { |
| 1449 | case 4: |
| 1450 | t = time.Unix(int64(binary.BigEndian.Uint32(b)), 0).Local() |
| 1451 | case 8: |
| 1452 | v := binary.BigEndian.Uint64(b) |
| 1453 | nanos := int64(v >> 34) |
| 1454 | if nanos > 999999999 { |
| 1455 | // In timestamp 64 and timestamp 96 formats, nanoseconds must not be larger than 999999999. |
| 1456 | err = InvalidTimestamp{Nanos: nanos} |
| 1457 | return |
| 1458 | } |
| 1459 | t = time.Unix(int64(v&(1<<34-1)), nanos).Local() |
| 1460 | case 12: |
| 1461 | nanos := int64(binary.BigEndian.Uint32(b)) |
| 1462 | if nanos > 999999999 { |