Typescript中如何计算可能含undefined的两个日期的间隔天数
问题原因
你遇到的TS报错核心有两个问题:
- 你定义的
startDate和endDate变量类型是Date | 0,TS不允许Date类型和数字直接做算术运算,Date实例需要先转成时间戳(数字类型)才能参与加减 - 你只判断了
undefined的情况,没有处理空字符串这类无效日期值,空字符串传入new Date()会得到Invalid Date,后续计算也会出问题
解决方案代码
// 先定义User类型 type User = { name: string; startDate?: string; endDate?: string; } const USER: User[] = [ { name: "user1", startDate: "2020-01-01", endDate: "2021-01-01" }, { name: "user2", startDate: "", endDate: "2021-01-01" }, { name: "user3", startDate: "2020-01-01", endDate: undefined } ] function getDuration(user: User): number { // 任意日期为空/假值直接返回0 if (!user.startDate || !user.endDate) return 0; const start = new Date(user.startDate); const end = new Date(user.endDate); // 日期格式无效也返回0 if (isNaN(start.getTime()) || isNaN(end.getTime())) return 0; // 计算间隔天数,1天=24*60*60*1000毫秒 const diffMs = Math.abs(end.getTime() - start.getTime()); return Math.round(diffMs / (1000 * 60 * 60 * 24)); } // 调用结果为 [366, 0, 0] 符合预期 const durations = USER.map(user => getDuration(user))
代码要点说明
- 先对入参做有效性拦截:只要
startDate或endDate是undefined、空字符串这类假值,直接返回0 - 用
Date.getTime()获取13位时间戳(数字类型),同时用isNaN()判断日期是否有效,避免无效日期参与计算 - 用
Math.abs()保证间隔天数为正数,不受起止日期先后顺序影响 - 最后除以一天的毫秒数取整得到最终的间隔天数,如果你需要向下取整可以把
Math.round换成Math.floor
内容的提问来源于stack exchange,提问作者achai
相关产品推荐
相关产品推荐

