import { DomainError } from '@/shared/exceptions' export class Month { constructor(public readonly value: string) { if (!/^\d{4}-\d{2}$/.test(value)) { throw new DomainError('月份格式错误,应为YYYY-MM') } } static current(): Month { const now = new Date() const year = now.getFullYear() const month = String(now.getMonth() + 1).padStart(2, '0') return new Month(`${year}-${month}`) } static create(value: string): Month { return new Month(value) } static fromDate(date: Date): Month { const year = date.getFullYear() const month = String(date.getMonth() + 1).padStart(2, '0') return new Month(`${year}-${month}`) } next(): Month { const [year, month] = this.value.split('-').map(Number) const nextMonth = month === 12 ? 1 : month + 1 const nextYear = month === 12 ? year + 1 : year return new Month(`${nextYear}-${String(nextMonth).padStart(2, '0')}`) } previous(): Month { const [year, month] = this.value.split('-').map(Number) const prevMonth = month === 1 ? 12 : month - 1 const prevYear = month === 1 ? year - 1 : year return new Month(`${prevYear}-${String(prevMonth).padStart(2, '0')}`) } equals(other: Month): boolean { return this.value === other.value } isAfter(other: Month): boolean { return this.value > other.value } isBefore(other: Month): boolean { return this.value < other.value } toString(): string { return this.value } getYear(): number { return parseInt(this.value.split('-')[0]) } getMonth(): number { return parseInt(this.value.split('-')[1]) } }