|
|
|
|
|
class DayConverter {
|
|
|
|
|
|
constructor(data) {
|
|
|
|
|
|
this.nameToValueMap = {};
|
|
|
|
|
|
this.valueToNameMap = {};
|
|
|
|
|
|
|
|
|
|
|
|
// 初始化映射关系
|
|
|
|
|
|
data.forEach(item => {
|
|
|
|
|
|
this.nameToValueMap[item.dayName] = item.dayValue;
|
|
|
|
|
|
this.valueToNameMap[item.dayValue] = item.dayName;
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 根据dayName获取dayValue
|
|
|
|
|
|
getValueByName(dayName) {
|
|
|
|
|
|
return this.nameToValueMap[dayName];
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 根据dayValue获取dayName
|
|
|
|
|
|
getNameByValue(dayValue) {
|
|
|
|
|
|
return this.valueToNameMap[dayValue];
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 根据dayName获取对应日期
|
|
|
|
|
|
getDateByDayName(dayName) {
|
|
|
|
|
|
const today = new Date();
|
|
|
|
|
|
const dayValue = this.getValueByName(dayName);
|
|
|
|
|
|
|
|
|
|
|
|
if (dayValue === undefined) {
|
|
|
|
|
|
throw new Error(`Invalid dayName: ${dayName}`);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const targetDate = new Date(today);
|
|
|
|
|
|
targetDate.setDate(today.getDate() - dayValue);
|
|
|
|
|
|
|
|
|
|
|
|
// 格式化为YYYY-MM-DD
|
|
|
|
|
|
const year = targetDate.getFullYear();
|
|
|
|
|
|
const month = String(targetDate.getMonth() + 1).padStart(2, '0');
|
|
|
|
|
|
const day = String(targetDate.getDate()).padStart(2, '0');
|
|
|
|
|
|
|
|
|
|
|
|
return `${year}-${month}-${day}`;
|
|
|
|
|
|
// return targetDate;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* -1 获取今天、昨天、前天的数据
|
|
|
|
|
|
* 0 获取今天
|
|
|
|
|
|
* 1 获取昨天
|
|
|
|
|
|
* 2 获取前天
|
|
|
|
|
|
* @param {时间} dateTime
|
|
|
|
|
|
*/
|
|
|
|
|
|
getDayParam(dateTime,point){
|
|
|
|
|
|
|
|
|
|
|
|
console.log(`获取参数,dateTime: ${dateTime},point:${point}`);
|
|
|
|
|
|
// 正确解析日期(处理时区问题)
|
|
|
|
|
|
const parseDate = (dateStr) => {
|
|
|
|
|
|
const [year, month, day] = dateStr.split('-').slice(0, 3).map(Number);
|
|
|
|
|
|
return new Date(year, month - 1, day); // 月份要减1
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
const cachedDateObj = parseDate(dateTime);
|
|
|
|
|
|
if (isNaN(cachedDateObj.getTime())) {
|
|
|
|
|
|
console.error('无效的日期');
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 获取今天、昨天、前天的日期(统一时区处理)
|
|
|
|
|
|
const now = new Date();
|
|
|
|
|
|
const today = new Date(now.getFullYear(), now.getMonth(), now.getDate());
|
|
|
|
|
|
|
|
|
|
|
|
const yesterday = new Date(today);
|
|
|
|
|
|
yesterday.setDate(yesterday.getDate() - 1);
|
|
|
|
|
|
|
|
|
|
|
|
const dayBeforeYesterday = new Date(today);
|
|
|
|
|
|
dayBeforeYesterday.setDate(dayBeforeYesterday.getDate() - 2);
|
|
|
|
|
|
|
|
|
|
|
|
// 比较日期
|
|
|
|
|
|
if (this.isSameDay(cachedDateObj, today)) {
|
|
|
|
|
|
return [{"day": 0, "package": point}]; // 今天
|
|
|
|
|
|
} else if (this.isSameDay(cachedDateObj, yesterday)) {
|
|
|
|
|
|
return [{"day": 0, "package": 0}, {"day": 1, "package": point}]; // 昨天
|
|
|
|
|
|
}
|
|
|
|
|
|
// else if (this.isSameDay(cachedDateObj, dayBeforeYesterday)) {
|
|
|
|
|
|
// return [{"day": 0, "package": 0}, {"day": 1, "package": 0}, {"day": 2, "package": point}]; //
|
|
|
|
|
|
// }
|
|
|
|
|
|
else {
|
|
|
|
|
|
return [{"day": 0, "package": 0}, {"day": 1, "package": 0}, {"day": 2, "package": point}]; // 前天或更早的日期
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 判断两个Date对象是否是同一天
|
|
|
|
|
|
* @param {Date} date1
|
|
|
|
|
|
* @param {Date} date2
|
|
|
|
|
|
* @returns {boolean}
|
|
|
|
|
|
*/
|
|
|
|
|
|
isSameDay(date1, date2) {
|
|
|
|
|
|
return date1.getFullYear() === date2.getFullYear() &&
|
|
|
|
|
|
date1.getMonth() === date2.getMonth() &&
|
|
|
|
|
|
date1.getDate() === date2.getDate();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 13 位时间戳,例子:1751295900000
|
|
|
|
|
|
* @param {string} fallAsleepTime 例子:06-30-23-05
|
|
|
|
|
|
*/
|
|
|
|
|
|
formatFullDateTime(fallAsleepTime){
|
|
|
|
|
|
if (!fallAsleepTime || typeof fallAsleepTime !== 'string') {
|
|
|
|
|
|
throw new Error('Invalid fallAsleepTime format. Expected "MM-dd-HH-mm"');
|
|
|
|
|
|
}
|
|
|
|
|
|
const currentYear = new Date().getFullYear();
|
|
|
|
|
|
// 拼接成 "2025-06-30-23-05"
|
|
|
|
|
|
const fullDateTimeString = `${currentYear}-${fallAsleepTime}`;
|
|
|
|
|
|
|
|
|
|
|
|
// 转换为标准格式 "2025-06-30T23:05"
|
|
|
|
|
|
const isoFormat = fullDateTimeString.replace(/-(\d{2})-(\d{2})$/, 'T$1:$2');
|
|
|
|
|
|
|
|
|
|
|
|
// 创建 Date 对象并获取时间戳
|
|
|
|
|
|
const timestamp = new Date(isoFormat).getTime();
|
|
|
|
|
|
console.log("完整日期时间字符串:", fullDateTimeString);
|
|
|
|
|
|
console.log("ISO 格式:", isoFormat);
|
|
|
|
|
|
console.log("时间戳:", timestamp);
|
|
|
|
|
|
return timestamp;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 计算时间戳对应的当天分钟数(0-1439)
|
|
|
|
|
|
* @param {number} timestamp - 13位毫秒级时间戳
|
|
|
|
|
|
* @returns {number} 分钟数
|
|
|
|
|
|
*/
|
|
|
|
|
|
getMinuteOfDay(timestamp) {
|
|
|
|
|
|
const date = new Date(timestamp);
|
|
|
|
|
|
return date.getHours() * 60 + date.getMinutes();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 睡眠片段日期格式化
|
|
|
|
|
|
* @param {*} timestamp
|
|
|
|
|
|
*/
|
|
|
|
|
|
formatDate(timestamp) {
|
|
|
|
|
|
const date = new Date(timestamp);
|
|
|
|
|
|
const year = date.getFullYear();
|
|
|
|
|
|
const month = String(date.getMonth() + 1).padStart(2, '0');
|
|
|
|
|
|
const day = String(date.getDate()).padStart(2, '0');
|
|
|
|
|
|
return `${year}${month}${day}`;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 获取1天的第N分钟
|
|
|
|
|
|
* @param {Number} timeString 例子:06-30-23-05
|
|
|
|
|
|
*/
|
|
|
|
|
|
getMinutesFromTime(timeString) {
|
|
|
|
|
|
const dateParts = timeString.split('-');
|
|
|
|
|
|
if (dateParts.length !== 4) {
|
|
|
|
|
|
throw new Error("时间格式必须是 MM-DD-HH-mm");
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const hour = parseInt(dateParts[2], 10); // 明确转换为十进制整数
|
|
|
|
|
|
const minute = parseInt(dateParts[3], 10);
|
|
|
|
|
|
|
|
|
|
|
|
if (isNaN(hour) || isNaN(minute)) {
|
|
|
|
|
|
throw new Error("小时和分钟必须是数字");
|
|
|
|
|
|
}
|
|
|
|
|
|
if (hour < 0 || hour >= 24 || minute < 0 || minute >= 60) {
|
|
|
|
|
|
throw new Error("小时需在 0-23 之间,分钟需在 0-59 之间");
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return hour * 60 + minute;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 使用示例
|
|
|
|
|
|
const data = [
|
|
|
|
|
|
{"dayName":"today","dayValue":0},
|
|
|
|
|
|
{"dayName":"yesterday","dayValue":1},
|
|
|
|
|
|
{"dayName":"dayBeforeYesterday","dayValue":2}
|
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
|
|
const dayConverter = new DayConverter(data);
|
|
|
|
|
|
export default dayConverter;
|