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

如何在JSON数据中检索当日日期时间并返回对应值的技术咨询

嘿,针对你要从JSON数据里检索当前日期/时间对应值班人员的需求,我整理了几个实用且高效的方案,你可以根据自己的技术栈来选:

1. 原生JavaScript实现(无依赖)

这个方案适合不想引入额外库的场景,核心是把JSON里的时间字符串转成Date对象,再和当前时间做范围判断。需要注意时区的处理——你的JSON时间带了时区偏移(比如-05:00),原生Date构造函数会自动解析这个偏移,不用担心时区不一致的问题。

示例代码:

// 你的原始JSON数据
const oncallData = [
  { 
    "startDateTime": "2018-04-11T14:17:00-05:00", 
    "endDateTime": "2018-04-11T14:18:00-05:00", 
    "oncallMember": [ "username1" ], 
    "shiftType": "historical" 
  },
  { 
    "startDateTime": "2018-04-11T14:18:00-05:00", 
    "endDateTime": "2018-04-16T08:00:00-05:00", 
    "oncallMember": [ "username2" ], 
    "shiftType": null 
  }
];

// 获取当前时间的Date对象
const now = new Date();

// 筛选符合条件的条目
const currentOncall = oncallData.find(item => {
  const start = new Date(item.startDateTime);
  const end = new Date(item.endDateTime);
  // 根据业务需求调整边界:这里是当前时间在[start, end)区间内
  return now >= start && now < end;
});

// 输出结果
if (currentOncall) {
  console.log("当前值班人员:", currentOncall.oncallMember);
} else {
  console.log("未找到匹配的值班记录");
}

要点提醒:

  • 按需调整边界条件:比如是否包含endDateTime,可以修改>=和<的符号
  • 原生Date解析ISO格式字符串的兼容性很好,现代浏览器和Node.js都支持
2. 借助日期处理库(更可靠,推荐)

如果你的项目已经在用日期处理库(比如moment.js、date-fns或者luxon),用它们处理时间会更简洁,还能避免手动处理时区、夏令时的坑。这里用luxon举例子(它是moment的继任者,更轻量化):

示例代码:

import { DateTime } from 'luxon';

const oncallData = [/* 你的JSON数据 */];
const now = DateTime.now();

const currentOncall = oncallData.find(item => {
  const start = DateTime.fromISO(item.startDateTime);
  const end = DateTime.fromISO(item.endDateTime);
  // luxon的区间判断更直观,不易出错
  return now >= start && now < end;
});

if (currentOncall) {
  console.log("当前值班人员:", currentOncall.oncallMember);
}

推荐用库的原因:

  • 处理时区、夏令时等复杂场景更可靠
  • 提供大量便捷的日期操作方法(比如区间判断、格式化)
  • 代码可读性更高,后期维护成本低
3. 数据量大时的性能优化

如果你的JSON条目非常多(比如上千条),可以做以下优化:

  • 提前把所有startDateTime和endDateTime转成时间戳(getTime()返回的毫秒数),避免循环时重复解析
  • 如果数据是按时间顺序排序的,用二分查找替代find()遍历,效率会大幅提升

预转时间戳的示例:

// 预处理数据,缓存时间戳
const processedData = oncallData.map(item => ({
  ...item,
  startTimestamp: new Date(item.startDateTime).getTime(),
  endTimestamp: new Date(item.endDateTime).getTime()
}));

const nowTimestamp = Date.now();
const currentOncall = processedData.find(item => {
  return nowTimestamp >= item.startTimestamp && nowTimestamp < item.endTimestamp;
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:40:21