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

本地测试法定节假日日期判断正常,GitHub CI测试失败的时区问题求助

本地测试法定节假日日期判断正常,GitHub CI测试失败的时区问题求助

问题分析

你的猜测完全正确,问题根源就是toLocaleDateString()这个方法的行为依赖运行环境的时区和区域设置,导致本地和GitHub CI环境输出的日期字符串不一致,进而匹配失败。

具体来说有两个核心问题:

  • 格式不统一:toLocaleDateString()在没有指定参数时,会根据系统的区域配置输出不同格式的日期(比如本地可能输出12/25/2025,而GitHub CI的UTC环境可能输出25/12/2025或其他格式),和你预设的YYYY-MM-DD格式完全不匹配。
  • 时区偏移风险:即使格式碰巧一致,不同时区下,同一个ISO时间转成Date对象后,toLocaleDateString()会基于本地时区解析日期。比如如果测试的是凌晨时段的时间,GMT-4的2025-12-25T00:30:00对应UTC的2025-12-24T04:30:00,这时候UTC环境下的日期就会变成24号,直接导致匹配失败。

解决方案

解决思路很明确:摆脱对toLocaleDateString()的依赖,生成固定格式、与时区无关(或固定目标时区)的日期字符串,确保和你节假日列表中的YYYY-MM-DD格式完全一致。

推荐两种可靠的实现方式:

方式1:转换为UTC标准的YYYY-MM-DD格式

如果你的节假日日期是按UTC日期定义的(或者测试用例的ISO时间已经对应目标日期的UTC时间),可以用这种方式:

// 新增一个格式化函数
function formatToYYYYMMDD(date) {
  const dateObj = new Date(date);
  const year = dateObj.getUTCFullYear();
  // 月份是0基,所以要+1,并且补前导0
  const month = String(dateObj.getUTCMonth() + 1).padStart(2, '0');
  const day = String(dateObj.getUTCDate()).padStart(2, '0');
  return `${year}-${month}-${day}`;
}

// 修改你的判断函数
function isStatHoliday(date) {
  const dateObject = new Date(date);
  const dateString = formatToYYYYMMDD(dateObject);
  return !!theProvince.statutory.find(holiday => holiday.date === dateString);
}

方式2:按目标时区(安大略省为America/Toronto)转换

如果你的节假日是按安大略省的本地日期定义的,更准确的做法是固定使用该时区来生成日期字符串:

// 新增带时区的格式化函数
function formatToYYYYMMDDByTimezone(date, timezone = 'America/Toronto') {
  // 指定格式和时区,确保输出统一的MM/DD/YYYY格式
  const options = {
    year: 'numeric',
    month: '2-digit',
    day: '2-digit',
    timeZone: timezone
  };
  // 拆分后重新拼接成YYYY-MM-DD
  const [month, day, year] = new Date(date).toLocaleDateString('en-US', options).split('/');
  return `${year}-${month}-${day}`;
}

// 修改判断函数
function isStatHoliday(date) {
  const dateObject = new Date(date);
  const dateString = formatToYYYYMMDDByTimezone(dateObject);
  return !!theProvince.statutory.find(holiday => holiday.date === dateString);
}

验证效果

修改后,不管是你本地的GMT-4环境,还是GitHub CI的UTC环境,都会生成统一的YYYY-MM-DD格式字符串,和你节假日列表中的日期格式完全匹配,测试就能稳定通过了。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.07 10:14:31