* 描述问题
使用工作流中的JS脚本进行时间差计算时,结果出错(已排除脚本问题)
* 运行环境
demo环境
如何重现
JS脚本如下:
// const http = require('http')
/**
* 计算两个时间点之间的有效工作时长(单位:小时)
* 排除午休时间、周末和法定节假日
* @param {Date} startTime 开始时间
* @param {Date} endTime 结束时间
* @param {string[]} holidays 法定节假日日期数组(格式:'YYYY-MM-DD')
* @param {string[]} patchdays 补班日期
* @returns {number} 有效工作时间(小时),保留两位小数
*/
const DateData = await syncHolidays()
// 国家法定节假日
const holidays = DateData.filter(i=> i.status === 3).map(i=>i.date) || []
const patchdays = DateData.filter(i=>i.status === 2).map(i=>i.date)
function calculateWorkingHours(startTime, endTime) {
// 工作时间段配置(24小时制,小数表示分钟)
const workPeriods = [
{ start: 8.5, end: 12.5 },
{ start: 14, end: 18 }
];
// 日期格式转换工具
const toISODate = date => date.toISOString().slice(0, 10);
let total = 0;
const current = new Date(startTime);
const end = new Date(endTime);
// 跨天处理循环
while (current < end) {
const dayStart = new Date(current);
dayStart.setHours(0, 0, 0, 0); // 当天零点
const nextDay = new Date(dayStart);
nextDay.setDate(nextDay.getDate() + 1); // 次日零点
// 判断是否工作日(排除周末和节假日)
const isWeekend = current.getDay() % 6 === 0
const isHoliday = holidays.includes(toISODate(current));
const isPatchDay = patchdays.includes(toISODate(current))
const isWorkingDay = isPatchDay ? true : !isWeekend && !isHoliday;
if (isWorkingDay) {
// 计算当天有效时间范围
const dayEffectiveStart = new Date(Math.max(current, dayStart));
const dayEffectiveEnd = new Date(Math.min(end, nextDay));
// 工作时间段计算
for (const period of workPeriods) {
const periodStart = new Date(dayStart);
periodStart.setHours(Math.floor(period.start), (period.start % 1) * 60);
const periodEnd = new Date(dayStart);
periodEnd.setHours(Math.floor(period.end), (period.end % 1) * 60);
// 计算时间段交集
const overlapStart = new Date(Math.max(dayEffectiveStart, periodStart));
const overlapEnd = new Date(Math.min(dayEffectiveEnd, periodEnd));
if (overlapStart < overlapEnd) {
total += (overlapEnd - overlapStart) / 3600000; // 毫秒转小时
}
}
}
current.setDate(current.getDate() + 1); // 移至下一天
}
return Number(total.toFixed(2));
}
async function syncHolidays() {
// const year = new Date().getFullYear();
// const url = `http://api.haoshenqi.top/holiday?date=${year}`;
// return new Promise(resove=>{
// // 发起 HTTP 请求
// http.get(url, (res) => {
// let data = '';
// // 数据块接收
// res.on('data', (chunk) => {
// data += chunk;
// });
// // 请求完成后,输出响应内容
// res.on('end', () => {
// const _d = JSON.parse(data)
// resove(_d)
// });
// }).on('error', (err) => {
// console.log('Error: ' + err.message);
// });
// })
return []
}
// 在工作流中使用参数
const timeDifference = calculateWorkingHours(begtime11, endtime11);
// 将结果返回给工作流
return timeDifference;