// pages/date-calc/date-calc.ts Page({ data: { currentTab: 0, startDate: '', startWeekday: '', // 新增:开始日期的星期 endDate: '', days: 0, // 可以为空字符串以便清空输入框,但 input type number 会处理 resultDate: '', resultWeekday: '', intervalDays: 0, intervalWeeks: 0, intervalRemainingDays: 0 }, onLoad() { const today = new Date(); const dateStr = this.formatDate(today); this.setData({ startDate: dateStr, endDate: dateStr, resultDate: dateStr, resultWeekday: this.getWeekday(today), startWeekday: this.getWeekday(today) }); }, switchTab(e: any) { this.setData({ currentTab: parseFloat(e.currentTarget.dataset.index) }); this.calculate(); // 切换时重新计算 }, bindDateChange(e: any) { const field = e.currentTarget.dataset.field; this.setData({ [field]: e.detail.value }); // 如果修改的是开始日期,同步更新星期显示 if (field === 'startDate') { const d = new Date(e.detail.value); this.setData({ startWeekday: this.getWeekday(d) }); } this.calculate(); }, bindDaysInput(e: any) { const val = e.detail.value; // 允许输入负号 if (val === '-' || val === '') { this.setData({ days: val }); return; } this.setData({ days: parseInt(val) }); this.calculate(); }, setDays(e: any) { const days = parseInt(e.currentTarget.dataset.days); this.setData({ days: days }); this.calculate(); }, calculate() { if (this.data.currentTab === 0) { // 日期推算 // 注意:直接使用 new Date('2023-10-01') 在 iOS 上可能不兼容,应替换为 '/' const start = new Date(this.data.startDate.replace(/-/g, '/')); // days 可能是字符串或数字 const dayOffset = typeof(this.data.days) === 'number' ? this.data.days : parseInt(this.data.days || '0'); const target = new Date(start.getTime() + dayOffset * 24 * 60 * 60 * 1000); this.setData({ resultDate: this.formatDate(target), resultWeekday: this.getWeekday(target) }); } else { // 日期通过 (Interval) const start = new Date(this.data.startDate.replace(/-/g, '/')); const end = new Date(this.data.endDate.replace(/-/g, '/')); const diffTime = Math.abs(end.getTime() - start.getTime()); const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24)); const weeks = Math.floor(diffDays / 7); const remainingDays = diffDays % 7; this.setData({ intervalDays: diffDays, intervalWeeks: weeks, intervalRemainingDays: remainingDays }); } }, formatDate(date: Date): string { const y = date.getFullYear(); const m = (date.getMonth() + 1).toString().padStart(2, '0'); const d = date.getDate().toString().padStart(2, '0'); return `${y}-${m}-${d}`; }, getWeekday(date: Date): string { const days = ['周日', '周一', '周二', '周三', '周四', '周五', '周六']; return days[date.getDay()]; } })