You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 18:30:06