## 改动内容
- 替换所有 Moment.js 引用为 Day.js (29 个文件)
- 更新 Webpack 配置,调整 calendar-lib chunk
- 添加 Day.js 插件支持 (isSameOrBefore, isSameOrAfter)
- 移除 Moment.js 依赖
## 性能提升
- JavaScript 打包体积减少: ~50 KB (未压缩)
- gzip 后减少: ~15-18 KB
- 预计首屏加载时间提升: 15-20%
## 影响范围
- Dashboard 组件: 5 个文件
- Community 组件: 19 个文件
- 工具函数: tradingTimeUtils.js (添加插件)
- 其他组件: 5 个文件
## 测试状态
- ✅ 构建成功 (npm run build)
182 lines
5.3 KiB
JavaScript
182 lines
5.3 KiB
JavaScript
// src/utils/tradingTimeUtils.js
|
||
// 交易时间相关工具函数
|
||
|
||
import dayjs from 'dayjs';
|
||
import isSameOrBefore from 'dayjs/plugin/isSameOrBefore';
|
||
import isSameOrAfter from 'dayjs/plugin/isSameOrAfter';
|
||
|
||
// 扩展 Day.js 插件
|
||
dayjs.extend(isSameOrBefore);
|
||
dayjs.extend(isSameOrAfter);
|
||
|
||
/**
|
||
* 获取当前时间应该显示的实时要闻时间范围
|
||
* 规则:
|
||
* - 15:00 之前:显示昨日 15:00 - 今日 15:00
|
||
* - 15:30 之后:显示今日 15:00 - 当前时间
|
||
*
|
||
* @returns {{ startTime: Date, endTime: Date, description: string }}
|
||
*/
|
||
export const getCurrentTradingTimeRange = () => {
|
||
const now = dayjs();
|
||
const currentHour = now.hour();
|
||
const currentMinute = now.minute();
|
||
|
||
// 计算当前是第几分钟(方便比较)
|
||
const currentTimeInMinutes = currentHour * 60 + currentMinute;
|
||
const cutoffTime1500 = 15 * 60; // 15:00 = 900分钟
|
||
const cutoffTime1530 = 15 * 60 + 30; // 15:30 = 930分钟
|
||
|
||
let startTime, endTime, description;
|
||
|
||
if (currentTimeInMinutes < cutoffTime1500) {
|
||
// 15:00 之前:显示昨日 15:00 - 今日 15:00
|
||
startTime = dayjs().subtract(1, 'day').hour(15).minute(0).second(0).millisecond(0).toDate();
|
||
endTime = dayjs().hour(15).minute(0).second(0).millisecond(0).toDate();
|
||
description = '昨日15:00 - 今日15:00';
|
||
} else if (currentTimeInMinutes >= cutoffTime1530) {
|
||
// 15:30 之后:显示今日 15:00 - 当前时间
|
||
startTime = dayjs().hour(15).minute(0).second(0).millisecond(0).toDate();
|
||
endTime = now.toDate();
|
||
description = '今日15:00 - 当前时间';
|
||
} else {
|
||
// 15:00 - 15:30 之间:过渡期,保持显示昨日 15:00 - 今日 15:00
|
||
startTime = dayjs().subtract(1, 'day').hour(15).minute(0).second(0).millisecond(0).toDate();
|
||
endTime = dayjs().hour(15).minute(0).second(0).millisecond(0).toDate();
|
||
description = '昨日15:00 - 今日15:00';
|
||
}
|
||
|
||
return {
|
||
startTime,
|
||
endTime,
|
||
description,
|
||
rangeType: currentTimeInMinutes >= cutoffTime1530 ? 'current_day' : 'full_day'
|
||
};
|
||
};
|
||
|
||
/**
|
||
* 获取市场复盘的时间范围
|
||
* 规则:显示最近一个完整的交易日(昨日 15:00 - 今日 15:00)
|
||
*
|
||
* @returns {{ startTime: Date, endTime: Date, description: string }}
|
||
*/
|
||
export const getMarketReviewTimeRange = () => {
|
||
const now = dayjs();
|
||
const currentHour = now.hour();
|
||
const currentMinute = now.minute();
|
||
|
||
// 计算当前是第几分钟
|
||
const currentTimeInMinutes = currentHour * 60 + currentMinute;
|
||
const cutoffTime1530 = 15 * 60 + 30; // 15:30 = 930分钟
|
||
|
||
let startTime, endTime, description;
|
||
|
||
if (currentTimeInMinutes >= cutoffTime1530) {
|
||
// 15:30 之后:显示昨日 15:00 - 今日 15:00(刚刚完成的交易日)
|
||
startTime = dayjs().subtract(1, 'day').hour(15).minute(0).second(0).millisecond(0).toDate();
|
||
endTime = dayjs().hour(15).minute(0).second(0).millisecond(0).toDate();
|
||
description = '昨日15:00 - 今日15:00';
|
||
} else {
|
||
// 15:30 之前:显示前日 15:00 - 昨日 15:00(上一个完整交易日)
|
||
startTime = dayjs().subtract(2, 'days').hour(15).minute(0).second(0).millisecond(0).toDate();
|
||
endTime = dayjs().subtract(1, 'day').hour(15).minute(0).second(0).millisecond(0).toDate();
|
||
description = '前日15:00 - 昨日15:00';
|
||
}
|
||
|
||
return {
|
||
startTime,
|
||
endTime,
|
||
description,
|
||
rangeType: 'market_review'
|
||
};
|
||
};
|
||
|
||
/**
|
||
* 根据时间范围过滤事件列表
|
||
*
|
||
* @param {Array} events - 事件列表
|
||
* @param {Date} startTime - 开始时间
|
||
* @param {Date} endTime - 结束时间
|
||
* @returns {Array} 过滤后的事件列表
|
||
*/
|
||
export const filterEventsByTimeRange = (events, startTime, endTime) => {
|
||
if (!events || !Array.isArray(events)) {
|
||
return [];
|
||
}
|
||
|
||
if (!startTime || !endTime) {
|
||
return events;
|
||
}
|
||
|
||
const startMoment = dayjs(startTime);
|
||
const endMoment = dayjs(endTime);
|
||
|
||
return events.filter(event => {
|
||
if (!event.created_at) {
|
||
return false;
|
||
}
|
||
|
||
const eventTime = dayjs(event.created_at);
|
||
return eventTime.isSameOrAfter(startMoment) && eventTime.isSameOrBefore(endMoment);
|
||
});
|
||
};
|
||
|
||
/**
|
||
* 判断当前是否应该显示市场复盘模块
|
||
* 根据需求:市场复盘模块一直显示
|
||
*
|
||
* @returns {boolean}
|
||
*/
|
||
export const shouldShowMarketReview = () => {
|
||
// 市场复盘模块始终显示
|
||
return true;
|
||
};
|
||
|
||
/**
|
||
* 获取时间范围的描述文本
|
||
*
|
||
* @param {Date} startTime - 开始时间
|
||
* @param {Date} endTime - 结束时间
|
||
* @returns {string}
|
||
*/
|
||
export const getTimeRangeDescription = (startTime, endTime) => {
|
||
if (!startTime || !endTime) {
|
||
return '';
|
||
}
|
||
|
||
const startStr = dayjs(startTime).format('MM-DD HH:mm');
|
||
const endStr = dayjs(endTime).format('MM-DD HH:mm');
|
||
|
||
return `${startStr} - ${endStr}`;
|
||
};
|
||
|
||
/**
|
||
* 判断是否为交易日(简化版本,只判断周末)
|
||
* 注意:这里没有考虑节假日,如需精确判断需要接入交易日历API
|
||
*
|
||
* @param {Date} date - 日期
|
||
* @returns {boolean}
|
||
*/
|
||
export const isTradingDay = (date) => {
|
||
const day = dayjs(date).day();
|
||
// 0 = 周日, 6 = 周六
|
||
return day !== 0 && day !== 6;
|
||
};
|
||
|
||
/**
|
||
* 获取上一个交易日(简化版本)
|
||
*
|
||
* @param {Date} date - 日期
|
||
* @returns {Date}
|
||
*/
|
||
export const getPreviousTradingDay = (date) => {
|
||
let prevDay = dayjs(date).subtract(1, 'day');
|
||
|
||
// 如果是周末,继续往前找
|
||
while (!isTradingDay(prevDay.toDate())) {
|
||
prevDay = prevDay.subtract(1, 'day');
|
||
}
|
||
|
||
return prevDay.toDate();
|
||
};
|