├── README.md
└── stringTime.js
/README.md:
--------------------------------------------------------------------------------
1 | # stringTime.js - Библиотека для работы с временем в строковом формате
2 | Все функции имеют подробную документацию написанную на JSDoc с примерами использования функций и описанием всех параметров и возвращаемых значений.
3 |
4 | ## Всего 10 Функции (225 строк кода)
5 | ### 2 вспомогательные функции
6 | 1. Проверка на число
7 | >isNumber(n)
8 |
9 | 2. Случайное число в диапазоне от min до max
10 | >randomInteger(min, max)
11 |
12 | ### 8 функций для работы с временем
13 | 1. Функция преобразует время в минуты.
14 | >timeToMinute(time)
15 |
16 | 2. Функция преобразует минуты в строку с временем.
17 | >minuteToTime(min)
18 |
19 | 3. Функция добавляет/вычитает из строки с временем время в минутах.
20 | >timeDivMinute(time, change)
21 |
22 | 4. Функция вычитает или складывает две строки времени.
23 | >timeDivTime(time1, time2, operator)
24 |
25 | 5. Перевести строку в секунды или миллисекунды.
26 | >changeTypeTime(time, type)
27 |
28 | 6. Проверяет является ли аргумент временем
29 | >isTime(time)
30 |
31 | 7. Сравнивает две строки с временем
32 | >compareTime(time1, time2)
33 |
34 | 8. Возвращает правильное склонение для указанного числа
35 | если задать вопрос: какое количество секунд, минут, часов, дней, недель, месяцев или лет?
36 | >decOfNum(num, type)
37 |
38 | ### Литература:
39 | 1. JSDoc
40 | 2. Перехват ошибок
41 | 3. Обработка ошибок
42 |
43 |
44 | ### Исмаил Усеинов:
45 | * __YouTube канал ITDoctor:__ https://www.youtube.com/c/ITDoctor
46 | * __Телеграм:__ https://t.me/itdoctorstudio
47 | * __Группа в ВК:__ https://vk.com/itdoctorstudio
48 |
--------------------------------------------------------------------------------
/stringTime.js:
--------------------------------------------------------------------------------
1 | //Месеца
2 | const month = ["", "января", "февраля", "марта", "апреля", "мая", "июня", "июля", "августа", "сентября", "октября", "ноября", "декабря"];
3 | //Месяца в именительном падеже
4 | const monthIp = ["", "январь", "февраль", "март", "апрель", "май", "июнь", "июль", "август", "сентябрь", "октябрь", "ноябрь", "декабрь"];
5 | //Форматирование времени
6 | const options = { hour: 'numeric', minute: 'numeric' };
7 |
8 | ////Математические функции////
9 | /**
10 | * Проверка на число
11 | * @param {number} n любое число или строка
12 | * @return {boolean} возвращает true если аргумент является числом, в противном случае false
13 | */
14 | function isNumber(n) {
15 | return !isNaN(parseFloat(n)) && !isNaN(n - 0)
16 | }
17 | /**
18 | * Случайное число в диапазоне от min до max
19 | * @param {number} min минимальное число
20 | * @param {number} max максимальное число
21 | * @return {number} случайное число в указанном диапазоне
22 | */
23 | function randomInteger(min, max) {
24 | // случайное число от min до (max+1)
25 | let rand = min + Math.random() * (max + 1 - min);
26 | return Math.floor(rand);
27 | }
28 |
29 | ////Функции по работе с временем////
30 |
31 | /**
32 | * Функция преобразует время в минуты.
33 | * @param {string} time время в виде строки, например "02:08". Может быть в диапазоне от "00:00" до "23:59".
34 | * @return {number} целое число в минутах. Например time="02:08" вернет 128.
35 | */
36 | function timeToMinute(time) {
37 | try {
38 | let hour = +time.split(":")[0]//часы
39 | let minute = +time.split(":")[1]//минуты
40 | //Ошибка диапазона аргумента или его типа
41 | if(!(hour>=0 && hour<=23) || !(minute>=0 && minute<=59))
42 | throw new RangeError("Аргумент должент быть в формате 'hh:mm' - 'hh' должен быть от 0 до 23, а 'mm' должен быть от 0 до 59. 'hh' и 'mm' должны быть числами и разделяться знаком ':'")
43 | //Возвращаем результат если ошибок нет
44 | return hour*60+minute
45 | } catch(e) {
46 | //Если ошибка была, то выводим в консоль сообщение
47 | console.log(e)
48 | }
49 | }
50 |
51 | /**
52 | * Функция преобразует минуты в строку с временем.
53 | * @param {number} min время в виде целого числа, например 62. Может быть отрицательным числом.
54 | * @return {string} время в виде строки. Например min=62 вернет "01:02",
55 | * min=-5 вернет "23:55", min=1439 вернет "23:59", min=1440 вернет "00:00", min=2882 вернет "00:02".
56 | */
57 | function minuteToTime(min) {
58 | try {
59 | let h, m, s
60 | //Ошибка типа аргумента
61 | if (!isNumber(min)) {
62 | throw new TypeError("Аргумент функции должен быть числом")
63 | }
64 | if (min < 0 || min > 1439) {
65 | let newMinute = min
66 | //-60 станет 1380 (-1 час = 23 часа)
67 | if (min < 0) {
68 | newMinute = min + (Math.trunc(Math.abs(min) / 1440) + 1) * 1440
69 | }
70 | let tmpHour = Math.trunc(newMinute / 60)
71 | let tmpMinute = newMinute % 60
72 | h = tmpHour % 24 + ""
73 | m = Math.trunc(tmpMinute % 60) + ""
74 | s = Math.trunc((tmpMinute % 60 - Math.trunc(tmpMinute % 60)) * 60) + ""
75 | } else {
76 | h = Math.trunc(min / 60) + ""
77 | m = Math.trunc(min % 60) + ""
78 | s = Math.trunc((min % 60 - Math.trunc(min % 60)) * 60) + ""
79 | }
80 | if (h.length === 1) h = "0" + h
81 | if (m.length === 1) m = "0" + m
82 | if (s.length === 1) s = "0" + s
83 | return h + ":" + m// + ":" + s
84 | } catch (e) {
85 | //Если ошибка была, то выводим в консоль сообщение
86 | console.log(e)
87 | }
88 | }
89 |
90 | /**
91 | * Функция добавляет/вычитает из строки с временем время в минутах.
92 | * @param {string} time время в виде строки, например "02:08".
93 | * @param {number} change сколько минут добавить. Если отрицательное число, то вычесть.
94 | * @return {string} время в виде строки. Например time="00:02" change=-5 вернет "23:57".
95 | */
96 | function timeDivMinute(time, change) {
97 | return minuteToTime(timeToMinute(time)+change)
98 | }
99 |
100 | /**
101 | * Функция вычитает или складывает две строки времени.
102 | * @param {string} time1 время в виде строки, например "02:08".
103 | * @param {string} time2 время в виде строки, например "01:03".
104 | * @param {string} operator сложить строки "+", вычесть строки "-"
105 | * @return {string} время в виде строки. Например time1="02:02" time2="01:01" operator="-" вернет "01:01".
106 | */
107 | function timeDivTime(time1, time2, operator) {
108 | if(operator==="-")
109 | return minuteToTime(timeToMinute(time1)-timeToMinute(time2))
110 | if(operator==="+")
111 | return minuteToTime(timeToMinute(time1)+timeToMinute(time2))
112 | }
113 |
114 | /**
115 | * Перевести строку в секунды или миллисекунды.
116 | * @param {string} time время в виде строки, например "00:01".
117 | * @param {string} type может быть "s" для перевода в секунды и "ms" для перевода в миллисекунды.
118 | * @return {number} число секунд или миллисекунд. Например time="00:01" type="s" вернет 60.
119 | */
120 | function changeTypeTime(time, type) {
121 | if(type==="s")
122 | return timeToMinute(time)*60
123 | if(type==="ms")
124 | return timeToMinute(time)*60*1000
125 | }
126 |
127 | /**
128 | * Проверяет является ли аргумент временем
129 | * @param {string} time строка времени типа "01:26"
130 | * @return {boolean} true или false
131 | */
132 | function isTime(time) {
133 | return isNumber(+time[0])
134 | && isNumber(+time[1])
135 | && time[2]==":"
136 | && isNumber(+time[3])
137 | && isNumber(+time[4])
138 | }
139 |
140 | /**
141 | * Сравнивает две строки с временем
142 | * @param {string} time1 первая строка с временем
143 | * @param {string} time2 вторая строка с временем
144 | * @return {number} 1 если первый аргумент больше второго, -1 если первый аргумент меньше второго, 0 если аргументы равны
145 | */
146 | function compareTime(time1, time2) {
147 | let timeStr1 = timeToMinute(time1)
148 | let timeStr2 = timeToMinute(time2)
149 | if(timeStr1>timeStr2) return 1
150 | else if(timeStr1=2 && num[num.length-1]==5) ||
200 | (num.length>=2 && num[num.length-1]==6) ||
201 | (num.length>=2 && num[num.length-1]==7) ||
202 | (num.length>=2 && num[num.length-1]==8) ||
203 | (num.length>=2 && num[num.length-1]==9) ||
204 | (num.length>=2 && num[num.length-1]==0) ||
205 | (num.length>=2 && num[num.length-2]==1) ||
206 | num==5 || num==6 || num==7 || num==8 || num==9 || num==0
207 | )
208 | return num+" "+text[tmpType][2]
209 | //Для чисел 2, 3 или 4
210 | //Для чисел состоящих из более двух цифр, у которых предпоследняя цифра не равна 1, а последняя цифра равна 2, 3 или 4 (например: 22 минуты, 234 часа, 6423 месяца)
211 | if(
212 | (num.length>=2 && num[num.length-1]==2 && num[num.length-2]!==1) ||
213 | (num.length>=2 && num[num.length-1]==3 && num[num.length-2]!==1) ||
214 | (num.length>=2 && num[num.length-1]==4 && num[num.length-2]!==1) ||
215 | num==2 || num==3 || num==4
216 | )
217 | return num+" "+text[tmpType][1]
218 | //Для числа 1
219 | //Для чисел состоящих из более двух цифр, у которых предпоследняя цифра не равна 1, а последняя цифра равна 1 (например: 21 год, 631 день, 48251 секунда)
220 | if(
221 | (num.length>=2 && num[num.length-1]==1 && num[num.length-2]!==1) ||
222 | num==1
223 | )
224 | return num+" "+text[tmpType][0]
225 | }
--------------------------------------------------------------------------------