永康嘉持电器有限公司前端
小小儁爺
2024-12-25 c6da28cde9dc469ee1e2d4dba4b7234307d9bd5a
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
import dayjs from 'dayjs'
 
export const scaleList = [1, 2, 3, 4, 5, 6, 10, 12, 15, 20, 30, 60, 120, 180,
  240,
  360, 720, 1440
]
/**
 * 验证是否合法scale值
 *
 * @export
 * @param {number} scale
 * @returns
 */
export function validateScale(scale) {
  if (!scaleList.includes(scale)) {
    throw new RangeError(
      `错误的scale值,输入值为${scale},可用的scale值为${scaleList.join(',')}`)
  }
  return true;
}
 
/**
 * 根据给出的scale 和 start 时间 计算出用于计算和生成图表的启始时间
 * eg:Start 为10:10分 刻度为60,getBeginTimeOfTimeLine函数给出的时间 为 10:00分
 *                    刻度为5,getBeginTimeOfTimeLine函数给出的时间 为 10:10分
 *                    刻度为3,getBeginTimeOfTimeLine函数给出的时间 为 10:09分
 *
 * @export
 * @param {dayjs} start 
 * @param {number} [scale=60]
 * @returns {dayjs}计算的启始时间
 */
export function getBeginTimeOfTimeLine(start, scale = 60) {
  validateScale(scale)
  let timeBlocks;
  let startClone = start.clone();
  let rate = scale / 60;
  if (scale > 60) {
    timeBlocks = Math.floor(start.hour() / rate);
    startClone = startClone.hour(timeBlocks * rate).minute(0).second(0);
  } else {
    timeBlocks = Math.floor(start.minute() / scale);
    startClone = startClone.minute(timeBlocks * scale).second(0);
  }
 
  return startClone;
}
/**
 * 根据所给 scale计算 两个时间差一共可以分成多少个刻度
 * 注意: timdStart 并不是实际的开始计算的时间,会通过getBeginTimeOfTimeLine 函数计算出分割开始时间
 *
 * @export
 * @param {dayjs} timeStart 开始时间
 * @param {dayjs} timeEnd 结束时间
 * @param {number} [scale=60] 分割的刻度
 * @returns 时间块数量
 */
export function calcScalesAbout2Times(timeStart, timeEnd, scale = 60) {
  if (timeStart.isAfter(timeEnd)) {
    throw new TypeError('错误的参数顺序,函数calcScalesAbout2Times的第一个时间参数必须大于第二个时间参数')
  }
 
  validateScale(scale);
 
  let startBlocksTime = getBeginTimeOfTimeLine(timeStart, scale);
  let count = 0;
  while (!startBlocksTime.isAfter(timeEnd)) {
    count++;
    startBlocksTime = startBlocksTime.add(scale, "minute")
  }
 
  return count;
 
}