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

为何从Dynamics CRM日期字段获取的月份和日期值比实际值少1?

问题原因
  • JavaScript内置Date对象的getMonth()/setMonth()方法的月份取值范围为0~11,0对应1月,11对应12月,因此直接读取getMonth()的返回值会比实际公历月份少1,属于设计特性。
  • 日期比实际值少1属于时区偏移导致的问题:如果CRM存储的日期是UTC格式,你用本地时间方法(如getDate())读取,或是反过来用UTC方法读取本地时区的日期值,就会因为时区差出现跨天,导致日期取值少1。
解决方案

首先确认你需要的是本地时区的正午12点还是UTC时区的正午12点,选择对应代码即可:

方案1:设置为本地时区正午12点

// 入参rawDate为你从CRM字段读取到的原始日期值,支持字符串、时间戳等格式
const setToLocalNoon = (rawDate) => {
  const date = new Date(rawDate);
  // 直接将时分秒毫秒清零后设置为12点,最大程度避免时区偏移导致的跨天问题
  date.setHours(12, 0, 0, 0);
  return date;
}

// 示例:读取展示用的年月日
const targetDate = setToLocalNoon(yourCrmDateField);
const year = targetDate.getFullYear();
const month = targetDate.getMonth() + 1; // 月份+1得到实际1~12的取值
const day = targetDate.getDate();

方案2:设置为UTC时区正午12点

如果CRM日期字段统一存储UTC时间,使用UTC方法操作即可:

const setToUTCNoon = (rawDate) => {
  const date = new Date(rawDate);
  date.setUTCHours(12, 0, 0, 0);
  return date;
}

// 示例:读取展示用的年月日
const targetDate = setToUTCNoon(yourCrmDateField);
const year = targetDate.getUTCFullYear();
const month = targetDate.getUTCMonth() + 1;
const day = targetDate.getUTCDate();
调试建议

拿到Date对象后分别打印date.toString()(本地时间)和date.toISOString()(UTC时间),确认时间时区是否和你的预期一致,即可快速定位是取值方法用错还是时区参数不匹配。


内容的提问来源于stack exchange,提问作者J.S.Orris

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 14:15:00