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
相关产品推荐
相关产品推荐

