如何将'8:00-9:00 AM'转为ISO时间格式适配Angular FullCalendar?
解决方案
步骤1:拆分提取时间组件
先从输入字符串里拆分出开始时间、时段标识(AM/PM):
const timeStr = '8:00-9:00 AM'; // 拆分时段和时间范围 const [timeRange, period] = timeStr.split(' '); // 获取开始时间部分 const startTimeStr = timeRange.split('-')[0]; // 拆分小时、分钟并转为数字 const [hours, minutes] = startTimeStr.split(':').map(Number);
步骤2:转换为24小时制
根据AM/PM调整小时数,适配FullCalendar的时间格式要求:
let adjustedHours = hours; // PM时段且小时不为12时,加12转为24小时制 if (period === 'PM' && hours !== 12) { adjustedHours += 12; } // AM时段且小时为12时,转为0点 if (period === 'AM' && hours === 12) { adjustedHours = 0; }
步骤3:与目标日期拼接
把调整后的时间和目标日期(比如YYYY-MM-DD格式的字符串)拼接成FullCalendar支持的Date对象或ISO字符串:
// 替换为你的目标日期 const targetDateStr = '2024-05-20'; // 拼接成标准日期时间字符串 const fullDateTimeStr = `${targetDateStr}T${adjustedHours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}:00`; // 转为Date对象,可直接传给FullCalendar的事件start字段 const eventStartDate = new Date(fullDateTimeStr); // 也可以生成ISO格式字符串,FullCalendar同样支持 const eventStartISO = eventStartDate.toISOString();
封装成可复用方法
把逻辑封装成组件内的函数,方便调用:
formatStartTimeToFullCalendar(timeStr: string, targetDateStr: string): Date { const [timeRange, period] = timeStr.split(' '); const startTimeStr = timeRange.split('-')[0]; const [hours, minutes] = startTimeStr.split(':').map(Number); let adjustedHours = hours; if (period === 'PM' && hours !== 12) { adjustedHours += 12; } if (period === 'AM' && hours === 12) { adjustedHours = 0; } const fullDateTimeStr = `${targetDateStr}T${adjustedHours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}:00`; return new Date(fullDateTimeStr); } // 调用示例 const eventStart = this.formatStartTimeToFullCalendar('8:00-9:00 AM', '2024-05-20');
可选:用工具库简化逻辑
如果项目中引入了date-fns这类日期工具库,可以进一步简化转换:
import { parse } from 'date-fns'; const targetDate = new Date('2024-05-20'); // 直接解析并拼接日期 const eventStartDate = parse(startTimeStr + ' ' + period, 'h:mm a', targetDate);
内容的提问来源于stack exchange,提问作者Victor Alejandro
相关产品推荐
相关产品推荐

