summaryrefslogtreecommitdiffhomepage
path: root/packages/console/core/src/util
diff options
context:
space:
mode:
Diffstat (limited to 'packages/console/core/src/util')
-rw-r--r--packages/console/core/src/util/date.test.ts20
-rw-r--r--packages/console/core/src/util/date.ts29
2 files changed, 29 insertions, 20 deletions
diff --git a/packages/console/core/src/util/date.test.ts b/packages/console/core/src/util/date.test.ts
deleted file mode 100644
index 074df8a2f..000000000
--- a/packages/console/core/src/util/date.test.ts
+++ /dev/null
@@ -1,20 +0,0 @@
-import { describe, expect, test } from "bun:test"
-import { getWeekBounds } from "./date"
-
-describe("util.date.getWeekBounds", () => {
- test("returns a Monday-based week for Sunday dates", () => {
- const date = new Date("2026-01-18T12:00:00Z")
- const bounds = getWeekBounds(date)
-
- expect(bounds.start.toISOString()).toBe("2026-01-12T00:00:00.000Z")
- expect(bounds.end.toISOString()).toBe("2026-01-19T00:00:00.000Z")
- })
-
- test("returns a seven day window", () => {
- const date = new Date("2026-01-14T12:00:00Z")
- const bounds = getWeekBounds(date)
-
- const span = bounds.end.getTime() - bounds.start.getTime()
- expect(span).toBe(7 * 24 * 60 * 60 * 1000)
- })
-})
diff --git a/packages/console/core/src/util/date.ts b/packages/console/core/src/util/date.ts
index 9c1ab12d2..dea9c390e 100644
--- a/packages/console/core/src/util/date.ts
+++ b/packages/console/core/src/util/date.ts
@@ -7,3 +7,32 @@ export function getWeekBounds(date: Date) {
end.setUTCDate(start.getUTCDate() + 7)
return { start, end }
}
+
+export function getMonthlyBounds(now: Date, subscribed: Date) {
+ const day = subscribed.getUTCDate()
+ const hh = subscribed.getUTCHours()
+ const mm = subscribed.getUTCMinutes()
+ const ss = subscribed.getUTCSeconds()
+ const ms = subscribed.getUTCMilliseconds()
+
+ function anchor(year: number, month: number) {
+ const max = new Date(Date.UTC(year, month + 1, 0)).getUTCDate()
+ return new Date(Date.UTC(year, month, Math.min(day, max), hh, mm, ss, ms))
+ }
+
+ function shift(year: number, month: number, delta: number) {
+ const total = year * 12 + month + delta
+ return [Math.floor(total / 12), ((total % 12) + 12) % 12] as const
+ }
+
+ let y = now.getUTCFullYear()
+ let m = now.getUTCMonth()
+ let start = anchor(y, m)
+ if (start > now) {
+ ;[y, m] = shift(y, m, -1)
+ start = anchor(y, m)
+ }
+ const [ny, nm] = shift(y, m, 1)
+ const end = anchor(ny, nm)
+ return { start, end }
+}