Files
youlegames/codes/minipro/calculation/miniprogram/pages/date-calc/date-calc.ts

113 lines
3.1 KiB
TypeScript

// 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()];
}
})