2026-02-10 14:02:11 +00:00
|
|
|
package timeutil
|
|
|
|
|
|
2026-06-15 10:47:24 +00:00
|
|
|
import (
|
|
|
|
|
"time"
|
|
|
|
|
|
|
|
|
|
"gordenko.dev/dima/qb"
|
|
|
|
|
"gordenko.dev/dima/qb/proto"
|
|
|
|
|
)
|
2026-02-10 14:02:11 +00:00
|
|
|
|
|
|
|
|
func FirstSecondInPeriod(since time.Time, period string) (_ time.Time) {
|
|
|
|
|
y, m, d := since.Date()
|
|
|
|
|
|
|
|
|
|
switch period {
|
|
|
|
|
case "h":
|
|
|
|
|
h := since.Hour()
|
|
|
|
|
return time.Date(y, m, d, h, 0, 0, 0, time.Local)
|
|
|
|
|
case "d":
|
|
|
|
|
return time.Date(y, m, d, 0, 0, 0, 0, time.Local)
|
|
|
|
|
case "m":
|
|
|
|
|
return time.Date(y, m, 1, 0, 0, 0, 0, time.Local)
|
|
|
|
|
default:
|
|
|
|
|
return since
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func LastSecondInPeriod(until time.Time, period string) (_ time.Time) {
|
|
|
|
|
y, m, d := until.Date()
|
|
|
|
|
|
|
|
|
|
switch period {
|
|
|
|
|
case "h":
|
|
|
|
|
h := until.Hour()
|
|
|
|
|
return time.Date(y, m, d, h, 59, 59, 0, time.Local)
|
|
|
|
|
case "d":
|
|
|
|
|
return time.Date(y, m, d, 23, 59, 59, 0, time.Local)
|
|
|
|
|
case "m":
|
|
|
|
|
tm := time.Date(y, m, 1, 23, 59, 59, 0, time.Local)
|
|
|
|
|
// Додаю місяць
|
|
|
|
|
tm = tm.AddDate(0, 1, 0)
|
|
|
|
|
// Віднімаю день
|
|
|
|
|
return tm.AddDate(0, 0, -1)
|
|
|
|
|
default:
|
|
|
|
|
return until
|
|
|
|
|
}
|
|
|
|
|
}
|
2026-06-15 10:47:24 +00:00
|
|
|
|
|
|
|
|
func TimeBoundsOfAggregation(since, until proto.TimeBound, groupBy qb.GroupBy, firstHourOfDay int) (s time.Time, u time.Time) {
|
|
|
|
|
switch groupBy {
|
|
|
|
|
case qb.GroupByHour, qb.GroupByDay:
|
|
|
|
|
s = time.Date(since.Year, since.Month, since.Day, 0, 0, 0, 0, time.Local)
|
|
|
|
|
u = time.Date(until.Year, until.Month, until.Day, 0, 0, 0, 0, time.Local)
|
|
|
|
|
|
|
|
|
|
case qb.GroupByMonth:
|
|
|
|
|
s = time.Date(since.Year, since.Month, 1, 0, 0, 0, 0, time.Local)
|
|
|
|
|
u = time.Date(until.Year, until.Month, 1, 0, 0, 0, 0, time.Local)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if firstHourOfDay > 0 {
|
|
|
|
|
duration := time.Duration(firstHourOfDay) * time.Hour
|
|
|
|
|
s = s.Add(duration)
|
|
|
|
|
u = u.Add(duration)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
u = u.Add(-1 * time.Second)
|
|
|
|
|
return
|
|
|
|
|
}
|