feat: Add Scoreboard and Date Calc pages, update Calculator with scientific mode and new UI
This commit is contained in:
@@ -0,0 +1,112 @@
|
||||
// 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()];
|
||||
}
|
||||
})
|
||||
Reference in New Issue
Block a user