diff --git a/entry/src/main/ets/components/FbDateTimeField.ets b/entry/src/main/ets/components/FbDateTimeField.ets index 7b0b63d..d84f371 100644 --- a/entry/src/main/ets/components/FbDateTimeField.ets +++ b/entry/src/main/ets/components/FbDateTimeField.ets @@ -105,6 +105,38 @@ export function fbAddHour(time: string): string { return fbPad2(Math.min(hh + 1, 23)) + ':' + mm; } +/** `fbPlusHours()` 的返回形状(ArkTS 不允许匿名对象字面量作为返回值类型书写,单独给个接口) */ +export interface FbDateTime { + date: string; + time: string; +} + +/** + * `YYYY-MM-DD` + `HH:mm` 往后推 N 小时 ⇒ `{ date, time }`(**跨天自动进位**)。 + * + * 起源:工单 #34 追加需求(2026-11-01)—— + * 「当我选择了开始时间并确定之后,结束时间要跟着开始时间变成开始时间加1个小时。 + * 也就是说,所有时间我们都默认它是一个小时。如果不是一个小时,再让他自己去改。」 + * + * ⚠️ 为什么不复用上面的 `fbAddHour()`:那只返回时间、不带日期, + * 而且用 `Math.min(hh+1, 23)` **封顶 23 点** ⇒ 23:30 加一小时还是 23:30。 + * 日程跨天是常态(20:00 → 次日 02:00 是真实用例),必须有日期。 + * + * ⚠️ 用 `Date` 做进位而不是自己算:跨月、跨年、闰年、月末天数全交给运行时。 + * 自己 `if (hh >= 24) { dd += 1 }` 看着简单,但"11 月 30 日 + 1 天"就会错成 11 月 31 日。 + */ +export function fbPlusHours(date: string, time: string, hours: number): FbDateTime { + const d: Date = fbParseDate(date); + const h: number = time.length >= 5 ? parseInt(time.substring(0, 2), 10) : 9; + const m: number = time.length >= 5 ? parseInt(time.substring(3, 5), 10) : 0; + const out: Date = new Date(d.getFullYear(), d.getMonth(), d.getDate()); + out.setHours(h + hours, m, 0, 0); + return { + date: fbIsoOf(out), + time: fbPad2(out.getHours()) + ':' + fbPad2(out.getMinutes()) + }; +} + /** 日期 + 时分拼成服务端认的 `YYYY-MM-DD HH:MM`(秒由服务端补) */ export function fbJoinDateTime(date: string, time: string): string { return date + ' ' + time; diff --git a/entry/src/main/ets/components/FbEventEditSheet.ets b/entry/src/main/ets/components/FbEventEditSheet.ets index 77d8044..34d8f76 100644 --- a/entry/src/main/ets/components/FbEventEditSheet.ets +++ b/entry/src/main/ets/components/FbEventEditSheet.ets @@ -63,7 +63,10 @@ import { fbDateOf, fbTimeOf, fbIsoOf, - fbAddHour + fbAddHour, + // 工单 #34 追加需求:点「开始」确定后,结束 = 开始 + 1 小时(跨天自动进位) + fbPlusHours, + FbDateTime } from './FbDateTimeField'; const DOMAIN: number = 0x0000; @@ -671,7 +674,25 @@ export struct FbEventEditSheet { this.pickOpen = true; } - /** 「确定」:把草稿写回;开始改了还会把结束顺延(避免"负时长") */ + /** + * 「确定」:把草稿写回。 + * + * 🔵 工单 #34 追加需求(用户 2026-11-01): + * 「当我选择了开始时间并确定之后,结束时间要跟着开始时间变成开始时间加1个小时。 + * 也就是说,所有时间我们都默认它是一个小时。如果不是一个小时,再让他自己去改。」 + * + * ⇒ **点「开始」确定后,结束无条件重置为「开始 + 1 小时」**。 + * + * 改动前只在"会变成负时长"时才动结束(`if (结束 < 开始)`), + * 于是用户改了开始、结束还挂在老位置,实际时长变成随机的 —— 就是要灭掉这个。 + * + * ⚠️ 改「结束」那条路**一个字不动**:改结束不能影响开始。 + * 这正是"默认一小时、不像一小时再自己改"的另一半。 + * ⚠️ 跨天用 `fbPlusHours()` 的 `Date` 运算:23:30 + 1h ⇒ **次日 00:30**, + * 日期一起进一天。不要图省事写成 `fbAddHour()` —— 那个封顶 23 点且不带日期。 + * ⚠️ 全天日程不参与:时刻部分本来就不生效(`save()` 里全天走 `00:00:00`), + * 这里改了也不会落到服务端,但会让"切回非全天"时看到一个莫名的时间,所以跳过。 + */ private applyPicker(iso: string, hm: string): void { if (this.pickIsEnd) { this.fEndDate = iso; @@ -679,10 +700,11 @@ export struct FbEventEditSheet { } else { this.fStartDate = iso; this.fStartTime = hm; - // ⚠️ 开始改到"结束之后" ⇒ 把结束顺延到同一时刻(服务端不校验,但负时长是坏的) - if (this.fEndDate < iso || (this.fEndDate === iso && this.fEndTime < hm)) { - this.fEndDate = iso; - this.fEndTime = hm; + if (!this.fAllDay) { + // 结束 = 开始 + 1 小时(默认时长一律一小时;要别的时长用户自己去点「结束」改) + const plus: FbDateTime = fbPlusHours(iso, hm, 1); + this.fEndDate = plus.date; + this.fEndTime = plus.time; } } this.pickOpen = false;