| export function getWeekBounds(date: Date) { |
| const offset = (date.getUTCDay() + 6) % 7 |
| const start = new Date(date) |
| start.setUTCDate(date.getUTCDate() - offset) |
| start.setUTCHours(0, 0, 0, 0) |
| const end = new Date(start) |
| 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 } |
| } |
|
|