如何精确限制时间选项为整点值 过对应整点后立即禁用选项
需求说明
- 时间选项仅支持
11 AM to 1 PM (1:00:00 PM only) - 系统时间为
1:00:01 PM时即不允许选择1PM选项,只要时间过了1 PM整,该选项的可用状态需返回false
当前问题
现有逻辑下直到1:59:59 PM时1PM选项的可用状态仍返回true,只有系统时间到2 PM才会返回false,不符合预期。需要实现仅允许在对应整点整秒前选择时间选项,超过整点的任意时间都不允许选择。
问题根因
现有实现的时间格式化逻辑仅提取了当前时间的小时值和AM/PM标识,直接丢弃了分钟、秒、毫秒的数值,因此只要系统时间处于1点的小时区间(即1:00:00 ~ 1:59:59),格式化后的结果都会匹配到1 PM选项,自然会判定该选项可用,直到小时数值跳转到2点才会失效,本质是时间匹配粒度过粗,没有做整点时间的精确阈值校验。
修复实现
直接通过时间戳比较做精确判定,抛弃原有的字符串截取匹配逻辑,避免粒度太粗导致的判断误差:
public timeOptions = ['11 AM', '12 PM', '1 PM']; /** * 将时间选项字符串转换为当日对应整点的时间戳(分、秒、毫秒均置0) */ private getOptionTimestamp(optionStr: string): number { const [hourRaw, meridiem] = optionStr.split(' '); let hour = parseInt(hourRaw, 10); // 12小时制转24小时制 if (meridiem === 'PM' && hour !== 12) { hour += 12; } if (meridiem === 'AM' && hour === 12) { hour = 0; } const target = new Date(); target.setHours(hour, 0, 0, 0); return target.getTime(); } /** * 校验单个时间选项是否可用 * 规则:当前时间未超过选项对应整点时间才可用,过点哪怕1毫秒都返回false */ public isTimeOptionAvailable(option: string): boolean { return Date.now() <= this.getOptionTimestamp(option); } /** * 获取所有时间选项的可用状态 */ public getOptionsAvailability(): Record<string, boolean> { return this.timeOptions.reduce((res, option) => { res[option] = this.isTimeOptionAvailable(option); return res; }, {} as Record<string, boolean>); }
逻辑验证
- 1PM选项对应时间戳为当日13:00:00.000
- 系统时间为12:59:59.999时,时间戳小于1PM对应值,返回可用
- 系统时间为13:00:00.000时,时间戳等于1PM对应值,返回可用(符合仅1:00:00 PM整点可选择的要求)
- 系统时间为13:00:00.001及之后任意时间,属于过了1PM整,均返回不可用,完全匹配需求
内容的提问来源于stack exchange,提问作者Rajasekhar
相关产品推荐
相关产品推荐

