bool
YACTimespecToTAI(struct timespec *ts)
{
- int64_t v = (int64_t)(ts->tv_sec);
- int64_t i = 0;
- for (; i < YACLeapsecsN; i++) {
- if (v < YACLeapsecs[i]) {
- break;
+ int64_t v = 10 + (int64_t)(ts->tv_sec);
+ for (int64_t i = 0; i < YACLeapsecsN; i++) {
+ if (v >= YACLeapsecs[i]) {
+ v++;
}
}
- v += (int64_t)10 + i;
- if (v == YACLeapsecs[i]) {
- v++;
- }
if (((uint64_t)1 << ((sizeof(time_t) * 8) - 1)) < (uint64_t)v) {
return false;
}
go 1.22
-require go.cypherpunks.su/tai64n/v4 v4.0.0
+require go.cypherpunks.su/tai64n/v4 v4.1.0
require (
github.com/google/uuid v1.6.0
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=
github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
-go.cypherpunks.su/tai64n/v4 v4.0.0 h1:jFEoz3XLOdimA0ZXarzRvGYNublOpgFv04r656UrYiI=
-go.cypherpunks.su/tai64n/v4 v4.0.0/go.mod h1:/uKUdhLOy8UciRKpapPaFXSOoa/SiXjs3XsDDpAz7OA=
+go.cypherpunks.su/tai64n/v4 v4.1.0 h1:jW0EyklKXpSy9DSFMcDbu7XuLlMkn6kkpNWiMG6UT5c=
+go.cypherpunks.su/tai64n/v4 v4.1.0/go.mod h1:/uKUdhLOy8UciRKpapPaFXSOoa/SiXjs3XsDDpAz7OA=
def utc2tai(secs):
"""Add leapseconds to UTC
"""
- for diff, leapsec in enumerate(Leapsecs):
- if secs < leapsec:
- break
- secs += Leapsecs1972 + diff
- if secs == leapsec:
- secs += 1
+ secs += Leapsecs1972
+ for leapsec in Leapsecs:
+ if secs >= leapsec:
+ secs += 1
return secs
if isinstance(v, float):
raise NotImplementedError("no FLOAT* support")
if isinstance(v, datetime):
+ ms = v.microsecond
+ v = v.replace(microsecond=0)
secs = int(v.replace(tzinfo=timezone.utc).timestamp())
secs = utc2tai(secs) + TAI64Base
- if v.microsecond == 0:
+ if ms == 0:
return _byte(TagTAI64) + secs.to_bytes(8, "big")
return (
_byte(TagTAI64N) + secs.to_bytes(8, "big") +
- (v.microsecond * 1000).to_bytes(4, "big")
+ (ms * 1000).to_bytes(4, "big")
)
if isinstance(v, Raw):
return _byte(v.t) + v.v