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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 05:48:28