-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathclassTime.js
110 lines (93 loc) · 4.61 KB
/
classTime.js
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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
export class Time {
rusMonths = ['Января', 'Февраля', 'Марта', 'Апреля', 'Мая', 'Июня', 'Июля', 'Августа', 'Сентября','Октября','Ноября','Декабря'];
startTime = {};
endTime = {};
rowId = 0;
summary = [];
getTime(D = new Date()) {
let [year,month,day,hours,minutes,seconds] = [D.getFullYear(),D.getMonth(),D.getDate(),D.getHours(),D.getMinutes(), D.getSeconds()];
let fullDateTimeString = `${day} ${this.rusMonths[month]} ${year}, ${hours}:${minutes}:${seconds}`;
return {fullDateTimeString,year,month,day,hours,minutes,seconds};
}
hmsString(){ //СТРОКА h:m:s для часов
return `${this.addZero(this.getTime().hours)}:
${this.addZero(this.getTime().minutes)}:
${this.addZero(this.getTime().seconds)}`
}
sumHoursAndMins(startTime, endTime){ //разница между нач и кон временем в форматах {hours:0, minutes:0}
//случаи I: ч2 >= ч1 && м2 >= м1 тогда обычное вычитание "вторые минус первые"
//случаи II: ч2 > ч1 && м2 < м1 тогда ч2-ч1-1, м2-м1+60
//случаи III: ч2 <= ч1 && м2 < м1 тогда ч2-ч1+24-1, м2-м1+60
//случаи IV: ч2 < ч1 && м2 >= м1 тогда ч2-ч1+24, м2-м1
let hoursSum;
let minutesSum;
let [h1,m1,h2,m2] = [startTime.hours,startTime.minutes,endTime.hours,endTime.minutes];
if(h2 >= h1 && m2 >= m1){
hoursSum = h2-h2;
minutesSum = m2-m1;
} else if (h2 > h1 && m2 < m1){
hoursSum = h2-h1-1;
minutesSum = m2-m1+60;
} else if (h2 <= h1 && m2 < m1){
hoursSum = h2-h1+24-1;
minutesSum = m2-m1+60;
} else if (h2 < h1 && m2 >= m1){
hoursSum = h2-h1+24;
minutesSum = m2-m1;
} else throw new Error('непредусмотренная комбинация в функции sumHoursAndMins')
return {hoursSum, minutesSum};
}
addZero(number){ //добавляет 0 перед цифрой<10 и возвращает string!
if(number < 10){
return `0${number}`;
} else return `${number}`;
}
memento(startOrEnd){ //снимок: пишет в startTime{} или endTime{} текущие часы и минуты
if(startOrEnd === 'start'){
this.startTime = this.getTime();
} else if (startOrEnd === 'end'){
this.endTime = this.getTime();
} else console.log('unknown command');
}
makeTableRow(rows){ //возвращает содержимое для строки из трёх столбцов
// просто сокращения
let sum = this.sumHoursAndMins(this.startTime, this.endTime);
let stT = this.startTime;
let edT = this.endTime;
this.recordOneRow(this.rowId, stT, edT, sum);
return `<td>${rows} </td>
<td>${stT.hours}: ${this.addZero(stT.minutes)} - ${edT.hours}: ${this.addZero(edT.minutes)}</td>
<td>${sum.hoursSum} ч, ${sum.minutesSum} мин </td>
`
}
recordOneRow(rowId, startTime, endTime, totalDuration){ //записать 1 строку в массив объектов-строк
let rowObject = {rowId, startTime, endTime, totalDuration};
this.summary.push(rowObject);
}
makeFinalRow(){ //заполнить подвал таблицы финальными данными
let sumOfAllHours = this.sumAllRows(this.summary).hours;
let sumOfAllMinutes = this.sumAllRows(this.summary).minutes;
this.summary.push({summa:{sumOfAllHours,sumOfAllMinutes}}); //отдельный элемент для суммы
return `<td>Всего</td>
<td>${sumOfAllHours} ч,
${sumOfAllMinutes} мин</td>`
}
sumAllRows(summaryArray){ //посчитать сумму часов и минут всех строк массива
let sumAll = {hours: 0, minutes: 0};
summaryArray.forEach(record => {
if(record.totalDuration){ //чтобы избежать попадания на элемент с полем summa
sumAll.hours += record.totalDuration.hoursSum;
sumAll.minutes += record.totalDuration.minutesSum;
}
})
return sumAll
}
}
/*
let time = new Time();
console.log(
time.sumHoursAndMins(
{hours: 23, minutes:0},
{hours: 23, minutes: 0}
)
);*/