新建非今天的日程,默认时间固定为 09:00(不再沿用当前时刻) #4

Closed
opened 2026-11-02 06:36:40 +00:00 by laoyang · 1 comment
Owner

用户反馈(应用市场评价)

新建非今天的日程时,默认时间固定在当天 9 点,可能会更好。

根因(已定位到代码)

entry/src/main/ets/pages/EventEditPage.ets:274-279:

// 新建:日期取所选日(未选则今天),时间取当前时刻;结束 = 开始 + 1 小时
const base: number = AppStorage.get<number>('pendingEventDate') ?? Date.now();
const dayStart = new Date(new Date(base).getFullYear(), new Date(base).getMonth(),
  new Date(base).getDate()).getTime();
const now = new Date();
this.startMs = dayStart + now.getHours() * 3600000 + now.getMinutes() * 60000;
this.endMs = this.startMs + 3600000;

日期取所选日(正确),但时分取 now(当前时刻),与所选日期无关。
所以下午 15:20 点开"下周三"的新建页,得到的是「下周三 15:20」而不是「下周三 09:00」——
这就是用户说的"时间不固定"。

用户预期:新建时默认 09:00,而不是"现在几点就几点"。

需要澄清的一处

用户的表述是"新建非今天的日程时,默认固定在当天 9 点"。
这句话有两种读法,实现上差别不小:

读法 行为
A. 只改非今天 今天新建 → 仍用当前时刻(符合"现在就要记一件事"的直觉);非今天 → 09:00
B. 一律 09:00 不论哪天新建,都默认 09:00

A 更贴近用户原话,也更合理:今天新建时用户常常是"记一笔现在发生的事",
默认当前时刻有意义;而选别的日期时,"现在几点"毫无参考价值,09:00 才是合理的通用默认。

⚠️ 待确认:按 A 实现(推荐);若用户要 B 再调整。

顺带发现的相关不一致

toggleAllDay() 关闭全天后(同文件 685-691 行)硬编码回 9 点:

this.startMs = s.getTime() + 9 * 3600000;
this.endMs = this.startMs + 3600000;

也就是说"全天 → 关闭全天"已经默认 09:00 了,而"新建"却用当前时刻。
两者口径不统一,本次一并统一到 09:00 更符合直觉。

建议实现

  1. 抽一个常量/函数统一"默认开始时刻":09:00(含分钟归零)
  2. 新建分支:所选日 != 今天 → 用 09:00;== 今天 → 保持当前时刻(按 A 方案)
  3. toggleAllDay() 关闭全天的 9 点硬编码改为引用同一常量
  4. 结束时间仍是开始 +1 小时(不变)

验收标准

  • 在月视图选「后天」,点 + → 新建页默认「后天 09:00 - 10:00」
  • 今天点 + → 默认「现在时刻 - +1 小时」(按 A 方案)
  • 全天开关来回切一次 → 关闭后回到 09:00
  • 已有日程的编辑不受影响(走 loaded 分支,不碰默认值逻辑)
  • 编译通过 + 真机验证

为什么单独建单

应用市场用户反馈的第1条,与已关闭的 #2(WSL迁移)、#3(卸载清理)无关;是新建日程默认时间的产品行为调整

## 用户反馈(应用市场评价) > 新建非今天的日程时,默认时间固定在当天 9 点,可能会更好。 ## 根因(已定位到代码) `entry/src/main/ets/pages/EventEditPage.ets:274-279`: ```ts // 新建:日期取所选日(未选则今天),时间取当前时刻;结束 = 开始 + 1 小时 const base: number = AppStorage.get<number>('pendingEventDate') ?? Date.now(); const dayStart = new Date(new Date(base).getFullYear(), new Date(base).getMonth(), new Date(base).getDate()).getTime(); const now = new Date(); this.startMs = dayStart + now.getHours() * 3600000 + now.getMinutes() * 60000; this.endMs = this.startMs + 3600000; ``` **日期**取所选日(正确),但**时分取 `now`(当前时刻)**,与所选日期无关。 所以下午 15:20 点开"下周三"的新建页,得到的是「下周三 15:20」而不是「下周三 09:00」—— 这就是用户说的"时间不固定"。 用户预期:新建时默认 09:00,而不是"现在几点就几点"。 ## 需要澄清的一处 用户的表述是"**新建非今天的**日程时,默认固定在当天 9 点"。 这句话有两种读法,实现上差别不小: | 读法 | 行为 | |---|---| | A. 只改非今天 | 今天新建 → 仍用当前时刻(符合"现在就要记一件事"的直觉);非今天 → 09:00 | | B. 一律 09:00 | 不论哪天新建,都默认 09:00 | A 更贴近用户原话,也更合理:今天新建时用户常常是"记一笔现在发生的事", 默认当前时刻有意义;而选别的日期时,"现在几点"毫无参考价值,09:00 才是合理的通用默认。 ⚠️ 待确认:按 A 实现(推荐);若用户要 B 再调整。 ## 顺带发现的相关不一致 `toggleAllDay()` 关闭全天后(同文件 685-691 行)**硬编码回 9 点**: ```ts this.startMs = s.getTime() + 9 * 3600000; this.endMs = this.startMs + 3600000; ``` 也就是说"全天 → 关闭全天"已经默认 09:00 了,而"新建"却用当前时刻。 两者口径不统一,本次一并统一到 09:00 更符合直觉。 ## 建议实现 1. 抽一个常量/函数统一"默认开始时刻":`09:00`(含分钟归零) 2. 新建分支:**所选日 != 今天** → 用 09:00;**== 今天** → 保持当前时刻(按 A 方案) 3. `toggleAllDay()` 关闭全天的 9 点硬编码改为引用同一常量 4. 结束时间仍是开始 +1 小时(不变) ## 验收标准 - 在月视图选「后天」,点 + → 新建页默认「后天 09:00 - 10:00」 - 今天点 + → 默认「现在时刻 - +1 小时」(按 A 方案) - 全天开关来回切一次 → 关闭后回到 09:00 - 已有日程的编辑不受影响(走 loaded 分支,不碰默认值逻辑) - 编译通过 + 真机验证 --- ### 为什么单独建单 应用市场用户反馈的第1条,与已关闭的 #2(WSL迁移)、#3(卸载清理)无关;是新建日程默认时间的产品行为调整
Author
Owner

已随 0.2.0 完成并真机验证通过,关闭。

实现(按工单推荐的 A 方案)

entry/src/main/ets/pages/EventEditPage.ets:

  1. 新增常量(第 116 行)

    private static readonly DEFAULT_START_HOUR: number = 9;
    
  2. 新建分支(第 284-292 行):所选日 == 今天 → 当前时刻;≠ 今天 → 09:00

    if (dayStart === todayStart) {
      this.startMs = dayStart + now.getHours() * 3600000 + now.getMinutes() * 60000;
    } else {
      this.startMs = dayStart + EventEditPage.DEFAULT_START_HOUR * 3600000;
    }
    
  3. 全天开关(第 703 行):关闭全天时也引用同一常量,不再是硬编码的 9 * 3600000
    —— 之前"新建用当前时刻、关全天用 9 点"两套口径,现已统一。

验收对照

验收项 结果
月视图选「后天」点 + → 后天 09:00-10:00 ✅
今天点 + → 当前时刻 - +1 小时(A 方案) ✅
全天开关来回切 → 关闭后回到 09:00 ✅
编辑已有日程不受影响(走 loaded 分支) ✅
编译通过 ✅ BUILD SUCCESSFUL
真机验证 ✅ 用户确认真机通过

口径说明

采用 A 方案(只改非今天)而非 B 方案(一律 09:00):
今天新建时用户通常在"记一笔现在发生的事",默认当前时刻更有意义;
而选其它日期时"现在几点"毫无参考价值,09:00 才是合理默认。

已随 0.2.0 完成并真机验证通过,关闭。 ## 实现(按工单推荐的 A 方案) `entry/src/main/ets/pages/EventEditPage.ets`: 1. **新增常量**(第 116 行) ```ts private static readonly DEFAULT_START_HOUR: number = 9; ``` 2. **新建分支**(第 284-292 行):所选日 == 今天 → 当前时刻;≠ 今天 → 09:00 ```ts if (dayStart === todayStart) { this.startMs = dayStart + now.getHours() * 3600000 + now.getMinutes() * 60000; } else { this.startMs = dayStart + EventEditPage.DEFAULT_START_HOUR * 3600000; } ``` 3. **全天开关**(第 703 行):关闭全天时也引用同一常量,不再是硬编码的 `9 * 3600000` —— 之前"新建用当前时刻、关全天用 9 点"两套口径,现已统一。 ## 验收对照 | 验收项 | 结果 | |---|---| | 月视图选「后天」点 + → 后天 09:00-10:00 | ✅ | | 今天点 + → 当前时刻 - +1 小时(A 方案) | ✅ | | 全天开关来回切 → 关闭后回到 09:00 | ✅ | | 编辑已有日程不受影响(走 loaded 分支) | ✅ | | 编译通过 | ✅ BUILD SUCCESSFUL | | 真机验证 | ✅ 用户确认真机通过 | ## 口径说明 采用 A 方案(只改非今天)而非 B 方案(一律 09:00): 今天新建时用户通常在"记一笔现在发生的事",默认当前时刻更有意义; 而选其它日期时"现在几点"毫无参考价值,09:00 才是合理默认。
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: laoyang/SyncCalendar#4