113 lines
3.1 KiB
TypeScript
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()];
|
|
}
|
|
})
|