Laravel使用FullCalendar时如何移除链接中日期的时间部分仅保留年月日
问题说明
需要从类似2022-06-28T00:00:00+03:00&end=2022-06-30T23:59:59+03:00的链接参数字符串中移除时间与时区后缀,仅保留YYYY-MM-DD格式的年月日,适配Laravel项目中FullCalendar的日期参数要求。原有自定义buildIsoString方法未实现预期效果,原方法代码如下:
// timeZoneOffset is in minutes function buildIsoString(marker, timeZoneOffset, stripZeroTime) { if (stripZeroTime === void 0) { stripZeroTime = false; } var s = marker.toISOString(); s = s.replace('.000', ''); if (stripZeroTime) { s = s.replace('T00:00:00Z', ''); } if (s.length > 10) { // time part wasn't stripped, can add timezone info if (timeZoneOffset == null) { s = s.replace('Z', ''); } else if (timeZoneOffset !== 0) { s = s.replace('Z', formatTimeZoneOffset(timeZoneOffset, true)); } // otherwise, its UTC-0 and we want to keep the Z } return s; }
失效原因
原方法不生效的核心问题有两点:
- 时间匹配逻辑写死了固定字符串
T00:00:00Z,但实际使用的时间后缀带自定义时区偏移(比如+03:00),并非UTC标准的Z结尾,且结束类时间通常不是0点(比如示例里的23:59:59),固定匹配规则完全无法命中。 - 方法逻辑仅适配
toISOString()生成的标准UTC格式字符串,没有覆盖带自定义时区的ISO时间格式场景。
实现方案
根据实际使用场景二选一即可:
方案1:直接批量处理已生成的链接字符串
不需要改动原有日期生成逻辑,直接用正则全局替换掉所有时间后缀,适配性最强:
const rawParamStr = "2022-06-28T00:00:00+03:00&end=2022-06-30T23:59:59+03:00"; // 全局匹配所有T开头、直到参数分隔符&或字符串末尾的内容,替换为空 const formattedParamStr = rawParamStr.replace(/T[^&]*/g, ''); // 输出结果:2022-06-28&end=2022-06-30
这个写法不关心时间值、时区偏移的具体格式,只要是ISO日期格式里T后面跟的时间部分都能一次性清除。
方案2:修正buildIsoString生成逻辑
从日期生成源头直接输出符合要求的纯年月日格式,跳过后续时间、时区拼接步骤:
// timeZoneOffset is in minutes function buildIsoString(marker, timeZoneOffset, stripZeroTime) { if (stripZeroTime === void 0) { stripZeroTime = false; } // 开启剥离时间时直接返回纯年月日,不走后续时间处理逻辑 if (stripZeroTime) { // 需匹配本地时区日期用以下逻辑,避免UTC时间跨天问题 const year = marker.getFullYear(); const month = String(marker.getMonth() + 1).padStart(2, '0'); const day = String(marker.getDate()).padStart(2, '0'); return `${year}-${month}-${day}`; // 若需取UTC标准日期,可替换为下面这行 // return marker.toISOString().slice(0, 10); } let s = marker.toISOString(); s = s.replace('.000', ''); if (s.length > 10) { if (timeZoneOffset == null) { s = s.replace('Z', ''); } else if (timeZoneOffset !== 0) { s = s.replace('Z', formatTimeZoneOffset(timeZoneOffset, true)); } } return s; }
注意:如果业务日期需要和用户本地时区对齐,优先用本地年月日拼接逻辑,直接截取UTC字符串可能因为时区差出现日期偏差。
内容的提问来源于stack exchange,提问作者radu
相关产品推荐
相关产品推荐

