CMS服务端JS调用Date构造器返回无效日期,如何格式化Graph API返回的时间?
解决方案
方案1:原生字符串解析(无任何依赖)
微软Graph返回的日期格式为固定的ISO 8601格式,你可以直接通过字符串拆分获取时间分量,无需调用Date构造器解析整个字符串:
const dateString = "2021-11-03T07:45:00.0000000"; // 拆分出T后的时间部分 const timePart = dateString.split('T')[1]; // 提取时分 const [hours, minutes] = timePart.split(':').map(Number); // 格式化分钟为两位 const formattedMinutes = minutes.toString().padStart(2, '0'); console.log(`${hours}:${formattedMinutes}`);
如果原始字符串为UTC时间,需要转成当前运行环境的本地时间,可通过以下方式计算(仅用到无参数Date实例和Date.UTC静态方法,未触发new Date(日期字符串)的限制):
const dateString = "2021-11-03T07:45:00.0000000"; const [datePart, timePart] = dateString.split('T'); const [year, month, day] = datePart.split('-').map(Number); const [hoursUTC, minutesUTC] = timePart.split(':').map(part => Number(part.split('.')[0])); // 计算UTC时间总分钟数 const utcTotalMinutes = Date.UTC(year, month - 1, day, hoursUTC, minutesUTC) / 60000; // 获取本地时区偏移:返回值为UTC时间减本地时间的分钟差 const timezoneOffset = new Date().getTimezoneOffset(); // 计算本地时间总分钟数 const localTotalMinutes = utcTotalMinutes - timezoneOffset; // 提取当天的时分 const localHours = Math.floor(localTotalMinutes / 60) % 24; const localMinutes = Math.floor(localTotalMinutes % 60); const formattedMinutes = localMinutes.toString().padStart(2, '0'); console.log(`${localHours}:${formattedMinutes}`);
若运行环境完全禁止使用Date相关API,且时区固定,可直接手动叠加对应时区的小时偏移后取模24即可,比如东八区直接
const localHours = (hoursUTC + 8) % 24。
方案2:第三方依赖方案(更稳定,推荐)
直接使用轻量级的日期处理库dayjs,它可以完美兼容7位毫秒的ISO格式解析,且不会触发你CMS的语法限制:
- 安装依赖:
npm install dayjs - 代码实现:
import dayjs from 'dayjs'; import utc from 'dayjs/plugin/utc'; // 加载UTC插件处理时区转换 dayjs.extend(utc); const dateString = "2021-11-03T07:45:00.0000000"; // UTC时间转本地时间后格式化为H:mm const formattedTime = dayjs.utc(dateString).local().format('H:mm'); console.log(formattedTime);
内容的提问来源于stack exchange,提问作者Filip Huhta
相关产品推荐
相关产品推荐

