/** SIM 月份同时存在 yyyy-MM (SmartHub) 和 yyyyMM (Acceleronix) 两种格式。 */ const MONTH_PATTERN = /^(\d{4})(-?)(0[1-9]|1[0-2])$/ function parseMonth(month: string): { year: number; monthNumber: number; dashed: boolean } { const match = MONTH_PATTERN.exec(month) if (!match) throw new Error(`Invalid SIM card month: ${month}`) return { year: Number(match[1]), monthNumber: Number(match[3]), dashed: match[2] === '-', } } export function getDaysInMonth(month: string): number { const { year, monthNumber } = parseMonth(month) return new Date(year, monthNumber, 0).getDate() } export function getPrevMonth(month: string): string { const { year, monthNumber, dashed } = parseMonth(month) const previous = new Date(year, monthNumber - 2, 1) const separator = dashed ? '-' : '' return `${previous.getFullYear()}${separator}${String(previous.getMonth() + 1).padStart(2, '0')}` }