month.ts 922 B

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