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

JSON API返回日期提取日份 解决getDay报错实现相邻项比对

错误原因
  • 第一点:JSON 接口返回的日期值是ISO 8601格式的字符串类型,不是JavaScript原生Date实例,所以直接调用Date原型上的getDay()方法会抛出「不是函数」的类型错误。
  • 第二点:就算你提前把值转成了Date对象,getDay()本身的作用是获取星期值(返回0-6对应周日到周六),根本不是你需要的「月份中的日期(1-31)」,就算不报错也拿不到正确的日份结果。
  • 你最开始直接比对整个日期字符串的逻辑不准,是因为字符串里带了时分秒、时区偏移部分,哪怕是同一天的两个时间点,字符串内容也不一样,自然判断不准日期是否跨天。
实现方案

根据你的场景,有两种稳定可落地的实现,优先推荐第一种:

方案1:固定格式字符串截取(性能最高,无时区偏差)

你给出的接口返回日期是标准固定格式YYYY-MM-DDTHH:mm:ss±hh:mm,日份值固定在字符串的第9、10位(索引从0开始计数,对应切片位置8到10),不需要做类型转换,也不会有时区转换导致的日期偏差,代码最稳定:

// 注意循环从索引1开始,避免i=0时取i-1拿到undefined报错
for (let i = 1; i < data.length; i++) {
  const current = data[i].PresentationDate;
  const prev = data[i - 1].PresentationDate;
  // 直接截取出两位日份值
  const currentDay = current.slice(8, 10);
  const prevDay = prev.slice(8, 10);

  if (currentDay !== prevDay) {
    // 日份变更时触发你的业务逻辑,比如27变28就会走到这里
    // 自定义逻辑写在这
  }
}

方案2:转Date对象调用标准API(适合后续有其他日期计算需求的场景)

如果后续你还要基于日期做其他计算(比如算间隔天数、格式化输出等),可以先把字符串转为Date实例,再调用正确的API取日份:

注意:取月份中的日期要用getDate()方法,不要误用getDay()。如果你的业务需要严格匹配接口返回时区的日期值,不建议用这个方案——Date实例默认会按运行环境的本地时区返回日期,遇到跨时区的场景可能出现日份计算偏差。

for (let i = 1; i < data.length; i++) {
  const currentDate = new Date(data[i].PresentationDate);
  const prevDate = new Date(data[i - 1].PresentationDate);
  // getDate()返回1-31的当月日期值
  const currentDay = currentDate.getDate();
  const prevDay = prevDate.getDate();

  if (currentDay !== prevDay) {
    // 日份变更触发业务逻辑
  }
}
注意事项
  • 不要在i=0的时候取上一条数据,会拿到undefined触发新的类型错误,循环起始索引设为1即可
  • 如果接口返回的日期格式可能变动,不要用字符串截取方案,优先选转Date的方案
  • 如果你要判断的是自然日跨天(而非字符串里写的日份变更),转Date的时候要注意对齐时区,避免误判

内容的提问来源于stack exchange,提问作者hnnnng

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 15:36:21