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

