2019-01-01 19:55:51 -05:00
|
|
|
/* SPDX-License-Identifier: MIT
|
2018-05-03 09:04:00 -04:00
|
|
|
*
|
2022-09-20 11:21:32 -04:00
|
|
|
* Copyright (C) 2017-2023 WireGuard LLC. All Rights Reserved.
|
2018-05-03 09:04:00 -04:00
|
|
|
*/
|
|
|
|
|
2018-02-12 16:29:11 -05:00
|
|
|
package tai64n
|
2017-06-23 07:41:59 -04:00
|
|
|
|
|
|
|
import (
|
2017-06-24 09:34:17 -04:00
|
|
|
"bytes"
|
2017-06-23 07:41:59 -04:00
|
|
|
"encoding/binary"
|
|
|
|
"time"
|
|
|
|
)
|
|
|
|
|
2021-12-09 11:55:50 -05:00
|
|
|
const (
|
|
|
|
TimestampSize = 12
|
|
|
|
base = uint64(0x400000000000000a)
|
|
|
|
whitenerMask = uint32(0x1000000 - 1)
|
|
|
|
)
|
2017-06-23 07:41:59 -04:00
|
|
|
|
2018-02-11 13:25:33 -05:00
|
|
|
type Timestamp [TimestampSize]byte
|
2017-06-23 07:41:59 -04:00
|
|
|
|
2020-05-05 18:37:54 -04:00
|
|
|
func stamp(t time.Time) Timestamp {
|
2018-02-11 13:25:33 -05:00
|
|
|
var tai64n Timestamp
|
2020-05-05 18:37:54 -04:00
|
|
|
secs := base + uint64(t.Unix())
|
|
|
|
nano := uint32(t.Nanosecond()) &^ whitenerMask
|
2017-06-23 07:41:59 -04:00
|
|
|
binary.BigEndian.PutUint64(tai64n[:], secs)
|
|
|
|
binary.BigEndian.PutUint32(tai64n[8:], nano)
|
|
|
|
return tai64n
|
|
|
|
}
|
2017-06-24 09:34:17 -04:00
|
|
|
|
2020-05-05 18:37:54 -04:00
|
|
|
func Now() Timestamp {
|
|
|
|
return stamp(time.Now())
|
|
|
|
}
|
|
|
|
|
2018-02-11 13:25:33 -05:00
|
|
|
func (t1 Timestamp) After(t2 Timestamp) bool {
|
2017-06-24 09:34:17 -04:00
|
|
|
return bytes.Compare(t1[:], t2[:]) > 0
|
|
|
|
}
|
2021-02-03 11:56:46 -05:00
|
|
|
|
|
|
|
func (t Timestamp) String() string {
|
|
|
|
return time.Unix(int64(binary.BigEndian.Uint64(t[:8])-base), int64(binary.BigEndian.Uint32(t[8:12]))).String()
|
|
|
|
}
|