用户 2026-10-30 报:
鸿蒙端,日程添加时,选择时间,点上面,修改的反而是结束时间,这个是 bug。
在日程编辑表单里点**「开始」那一行(上面那行)弹出时间选择器, 选完确认后实际被改的是「结束」时间**。
entry/src/main/ets/components/FbEventEditSheet.ets 里, dateTimeRow 与 openPicker 的参数语义相反:
entry/src/main/ets/components/FbEventEditSheet.ets
dateTimeRow
openPicker
// 调用方传的是 isStart dateTimeRow(label: string, isStart: boolean) { FbDateTimeRow({ ... onTap: (): void => { this.openPicker(isStart); // ← isStart } }) } // 被调用方收的是 isEnd private openPicker(isEnd: boolean): void { this.pickIsEnd = isEnd; // ← 名字换了,语义反了 ... }
isStart=true(点「开始」)→ isEnd=true → 整条链路按"结束"处理。
isStart=true
isEnd=true
pickIsEnd 有三处消费者,全部跟着错:
pickIsEnd
applyPicker
fEndDate
fEndTime
两个控件长得一样、只有标签不同;且初值与写回同时错, 所以"弹出来的时间"和"改完的时间"是自洽的(都是结束时间), 看着不像坏,只是改错了对象。
FbMovieNewSheet.ets 用同一个 FbDateTimePicker 组件,但 pickIsEnd 是显式赋值:
FbMovieNewSheet.ets
FbDateTimePicker
this.pickIsEnd = false; // 开始 this.pickIsEnd = true; // 结束
没有正反颠倒的空间。日程这边用布尔参数透传,才让"参数名"和"语义"有机会不一致。
把 openPicker 参数语义统一成 isStart(与调用方一致),内部自行翻转:
isStart
private openPicker(isStart: boolean): void { this.pickIsEnd = !isStart; ... }
不选"调用处传 !isStart"是因为那会造出 openPicker(!isStart) 的双重否定, 更容易再错一次。让函数名与参数指向同一件事,最不容易复发。
!isStart
openPicker(!isStart)
鸿蒙端日程编辑表单 openPicker 参数语义写反(isStart 传给 isEnd),导致改开始时间却改了结束时间。与 #31(只读日历编辑入口权限)、#33(地址联想)改的文件和验证方式完全不同。
d2d0a43
FbEventEditSheet.ets 里 dateTimeRow 与 openPicker 的参数语义相反:
FbEventEditSheet.ets
dateTimeRow(label: string, isStart: boolean) { ... this.openPicker(isStart); // 传 isStart } private openPicker(isEnd: boolean): void { // 收 isEnd this.pickIsEnd = isEnd; ... }
pickIsEnd 有三处消费者,全部一起错,所以表现是"自洽"的:
弹出来的值和改完的值都是结束时间,一致 ⇒ 看着不像坏,只是改错了对象。
参数统一为 isStart,与调用方同名同义,内部自行取反:
private openPicker(isStart: boolean): void { this.pickIsEnd = !isStart; this.pickDate = fbParseDate(isStart ? this.fStartDate : this.fEndDate); const tm: Date = fbParseTime(isStart ? this.fStartTime : this.fEndTime); ... }
没有选择在调用处写 openPicker(!isStart) —— 那会造成双重否定,更容易再错一次。
只有日程编辑受影响。 观影表单 FbMovieNewSheet.ets 用同一个 FbDateTimePicker 组件,但 pickIsEnd 是显式赋 false/true,没有颠倒空间。
false
true
全仓库 grep isStart/isEnd,除本处外无其它使用点。
isEnd
BUILD SUCCESSFUL
pickIsEnd=!isStart
fStart*
fEnd*
hdc list targets
[Empty]
真机待验步骤(手机连上后我做):
用户原话:
34,需要修改。当我选择了开始时间并确定之后,结束时间要跟着开始时间变成 开始时间加1个小时。也就是说,所有时间我们都默认它是一个小时。 如果不是一个小时,再让他自己去改。
FbEventEditSheet.ets::applyPicker() 现在只在会变成负时长时才动结束时间:
FbEventEditSheet.ets::applyPicker()
} else { this.fStartDate = iso; this.fStartTime = hm; // ⚠️ 开始改到"结束之后" ⇒ 把结束顺延到同一时刻(服务端不校验,但负时长是坏的) if (this.fEndDate < iso || (this.fEndDate === iso && this.fEndTime < hm)) { this.fEndDate = iso; this.fEndTime = hm; } }
⇒ 改开始时间时,只要结束还在后面,结束时间一点不动。 用户改了开始、结束还挂在老位置,实际时长变成随机的 —— 这正是他要改的。
点「开始」确定后:结束 = 开始 + 1 小时,无条件(不是"只在负时长时")。
Date
fbAddHour()
FbDateTimeField.ets::fbAddHour() 是:
FbDateTimeField.ets::fbAddHour()
return fbPad2(Math.min(hh + 1, 23)) + ':' + mm;
两个问题:23:xx 加一小时仍是 23:xx(封顶),而且它只返回时间、不带日期, 没法表达「次日」。所以另写一个带日期的 fbPlusHour()(放在同一个文件, 与其它换算函数同一处,全应用唯一一份)。
fbPlusHour()
No dependencies set.
The note is not visible to the blocked user.
现象
用户 2026-10-30 报:
在日程编辑表单里点**「开始」那一行(上面那行)弹出时间选择器,
选完确认后实际被改的是「结束」时间**。
根因
entry/src/main/ets/components/FbEventEditSheet.ets里,dateTimeRow与openPicker的参数语义相反:isStart=true(点「开始」)→isEnd=true→ 整条链路按"结束"处理。pickIsEnd有三处消费者,全部跟着错:openPicker读初值applyPicker写回fEndDate/fEndTime为什么没被发现
两个控件长得一样、只有标签不同;且初值与写回同时错,
所以"弹出来的时间"和"改完的时间"是自洽的(都是结束时间),
看着不像坏,只是改错了对象。
对照:观影表单是对的
FbMovieNewSheet.ets用同一个FbDateTimePicker组件,但pickIsEnd是显式赋值:没有正反颠倒的空间。日程这边用布尔参数透传,才让"参数名"和"语义"有机会不一致。
修复
把
openPicker参数语义统一成isStart(与调用方一致),内部自行翻转:验收标准
为什么单独建单
鸿蒙端日程编辑表单 openPicker 参数语义写反(isStart 传给 isEnd),导致改开始时间却改了结束时间。与 #31(只读日历编辑入口权限)、#33(地址联想)改的文件和验证方式完全不同。
已修复(commit
d2d0a43,鸿蒙端仓库)根因
FbEventEditSheet.ets里dateTimeRow与openPicker的参数语义相反:isStart=true(点「开始」)→isEnd=true→ 整条链路按"结束"处理。为什么一直没被发现
pickIsEnd有三处消费者,全部一起错,所以表现是"自洽"的:fEndDate/fEndTime弹出来的值和改完的值都是结束时间,一致 ⇒ 看着不像坏,只是改错了对象。
修复
参数统一为
isStart,与调用方同名同义,内部自行取反:没有选择在调用处写
openPicker(!isStart)—— 那会造成双重否定,更容易再错一次。影响面
只有日程编辑受影响。 观影表单
FbMovieNewSheet.ets用同一个FbDateTimePicker组件,但pickIsEnd是显式赋false/true,没有颠倒空间。全仓库 grep
isStart/isEnd,除本处外无其它使用点。验证
BUILD SUCCESSFUL,33 tasks(17 executed)pickIsEnd=!isStart、读日期/读时间三条映射,全部符合预期fStart*→写fStart*→标题「选择开始时间」;点结束→读fEnd*→写fEnd*→标题「选择结束时间」fEnd*),证明判据非恒真hdc list targets=[Empty]),待插上后验证真机待验步骤(手机连上后我做):
追加需求(2026-11-01):确认「开始」后,结束时间自动 = 开始 + 1 小时
用户原话:
现状
FbEventEditSheet.ets::applyPicker()现在只在会变成负时长时才动结束时间:⇒ 改开始时间时,只要结束还在后面,结束时间一点不动。
用户改了开始、结束还挂在老位置,实际时长变成随机的 —— 这正是他要改的。
要改成
点「开始」确定后:结束 = 开始 + 1 小时,无条件(不是"只在负时长时")。
Date运算,不自己算验收标准
为什么不再用现成的
fbAddHour()FbDateTimeField.ets::fbAddHour()是:两个问题:23:xx 加一小时仍是 23:xx(封顶),而且它只返回时间、不带日期,
没法表达「次日」。所以另写一个带日期的
fbPlusHour()(放在同一个文件,与其它换算函数同一处,全应用唯一一份)。