mirror of
https://github.com/muety/wakapi.git
synced 2023-08-10 21:12:56 +03:00
fix: timestamp precision
This commit is contained in:
parent
54a944ec41
commit
f7520b2b4a
@ -76,28 +76,38 @@ func (j *CustomTime) UnmarshalJSON(b []byte) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// heartbeat timestamps arrive as strings for sqlite and as time.Time for postgres
|
||||||
func (j *CustomTime) Scan(value interface{}) error {
|
func (j *CustomTime) Scan(value interface{}) error {
|
||||||
|
var (
|
||||||
|
t time.Time
|
||||||
|
err error
|
||||||
|
)
|
||||||
|
|
||||||
switch value.(type) {
|
switch value.(type) {
|
||||||
case string:
|
case string:
|
||||||
t, err := time.Parse("2006-01-02 15:04:05-07:00", value.(string))
|
t, err = time.Parse("2006-01-02 15:04:05-07:00", value.(string))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.New(fmt.Sprintf("unsupported date time format: %s", value))
|
return errors.New(fmt.Sprintf("unsupported date time format: %s", value))
|
||||||
}
|
}
|
||||||
*j = CustomTime(t)
|
|
||||||
case int64:
|
case int64:
|
||||||
*j = CustomTime(time.Unix(value.(int64), 0))
|
t = time.Unix(0, value.(int64))
|
||||||
break
|
break
|
||||||
case time.Time:
|
case time.Time:
|
||||||
*j = CustomTime(value.(time.Time))
|
t = value.(time.Time)
|
||||||
break
|
break
|
||||||
default:
|
default:
|
||||||
return errors.New(fmt.Sprintf("unsupported type: %T", value))
|
return errors.New(fmt.Sprintf("unsupported type: %T", value))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
t = time.Unix(0, (t.UnixNano()/int64(time.Millisecond))*int64(time.Millisecond)) // round to millisecond precision
|
||||||
|
*j = CustomTime(t)
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (j CustomTime) Value() (driver.Value, error) {
|
func (j CustomTime) Value() (driver.Value, error) {
|
||||||
return time.Time(j), nil
|
t := time.Unix(0, j.T().UnixNano()/int64(time.Millisecond)*int64(time.Millisecond)) // round to millisecond precision
|
||||||
|
return t, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (j CustomTime) String() string {
|
func (j CustomTime) String() string {
|
||||||
@ -105,6 +115,6 @@ func (j CustomTime) String() string {
|
|||||||
return t.Format("2006-01-02 15:04:05.000")
|
return t.Format("2006-01-02 15:04:05.000")
|
||||||
}
|
}
|
||||||
|
|
||||||
func (j CustomTime) Time() time.Time {
|
func (j CustomTime) T() time.Time {
|
||||||
return time.Time(j)
|
return time.Time(j)
|
||||||
}
|
}
|
||||||
|
@ -54,7 +54,9 @@ def generate_data(n: int, n_projects: int = 5, n_past_hours: int = 24) -> List[H
|
|||||||
delta: timedelta = timedelta(
|
delta: timedelta = timedelta(
|
||||||
hours=random.randint(0, n_past_hours - 1),
|
hours=random.randint(0, n_past_hours - 1),
|
||||||
minutes=random.randint(0, 59),
|
minutes=random.randint(0, 59),
|
||||||
seconds=random.randint(0, 59)
|
seconds=random.randint(0, 59),
|
||||||
|
milliseconds=random.randint(0, 999),
|
||||||
|
microseconds=random.randint(0, 999)
|
||||||
)
|
)
|
||||||
|
|
||||||
data.append(Heartbeat(
|
data.append(Heartbeat(
|
||||||
|
@ -220,7 +220,7 @@ func (srv *SummaryService) aggregateBy(heartbeats []*models.Heartbeat, summaryTy
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
t1, t2, tdiff := h.Time.Time(), heartbeats[i-1].Time.Time(), time.Duration(0)
|
t1, t2, tdiff := h.Time.T(), heartbeats[i-1].Time.T(), time.Duration(0)
|
||||||
// This is a hack. The time difference between two heartbeats from two subsequent day (e.g. 23:59:59 and 00:00:01) are ignored.
|
// This is a hack. The time difference between two heartbeats from two subsequent day (e.g. 23:59:59 and 00:00:01) are ignored.
|
||||||
// This is to prevent a discrepancy between summaries computed solely from heartbeats and summaries involving pre-aggregated per-day summaries.
|
// This is to prevent a discrepancy between summaries computed solely from heartbeats and summaries involving pre-aggregated per-day summaries.
|
||||||
// For the latter, a duration is already pre-computed and information about individual heartbeats is lost, so there can be no cross-day overflow.
|
// For the latter, a duration is already pre-computed and information about individual heartbeats is lost, so there can be no cross-day overflow.
|
||||||
|
@ -1 +1 @@
|
|||||||
1.12.4
|
1.12.5
|
Loading…
Reference in New Issue
Block a user