39 lines
1.2 KiB
TypeScript
39 lines
1.2 KiB
TypeScript
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 }
|
|
}
|