@alexstukovnikov/oz-time 1.0.0 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -4,7 +4,8 @@ JavaScript-библиотека для работы с датой и време
4
4
 
5
5
  `OzTime` предоставляет неизменяемые объекты времени, фабричные функции создания экземпляров, арифметику по фиксированным и календарным единицам, сравнение, форматирование, работу с часовыми поясами, интервалы и длительности.
6
6
 
7
- [Полная документация API](https://AlexStukovnikov.github.io/oz-time/)
7
+ - Документация API: [AlexStukovnikov.github.io/oz-time](https://AlexStukovnikov.github.io/oz-time/)
8
+ - Пакет npm: [`@alexstukovnikov/oz-time`](https://www.npmjs.com/package/@alexstukovnikov/oz-time)
8
9
 
9
10
  ## Содержание
10
11
 
@@ -12,20 +13,16 @@ JavaScript-библиотека для работы с датой и време
12
13
  - [Возможности](#возможности)
13
14
  - [Установка](#установка)
14
15
  - [Быстрый старт](#быстрый-старт)
15
- - [Что использовать в каком случае](#что-использовать-в-каком-случае)
16
+ - [Основные сценарии](#основные-сценарии)
16
17
  - [Создание экземпляров](#создание-экземпляров)
17
18
  - [Арифметика](#арифметика)
18
19
  - [Сравнение](#сравнение)
19
20
  - [Форматирование](#форматирование)
20
21
  - [Часовые пояса](#часовые-пояса)
21
- - [Интервалы](#интервалы)
22
- - [Длительности](#длительности)
22
+ - [Интервалы и длительности](#интервалы-и-длительности)
23
23
  - [Поддерживаемые единицы времени](#поддерживаемые-единицы-времени)
24
24
  - [Токены форматирования](#токены-форматирования)
25
- - [Публичный API](#публичный-api)
26
25
  - [FAQ](#faq)
27
- - [Разработка](#разработка)
28
- - [Генерация документации](#генерация-документации)
29
26
  - [Ограничения и особенности](#ограничения-и-особенности)
30
27
  - [Лицензия](#лицензия)
31
28
 
@@ -50,48 +47,21 @@ JavaScript-библиотека для работы с датой и време
50
47
  ## Возможности
51
48
 
52
49
  - Неизменяемые экземпляры `OzTime`
53
- - Фабричные функции:
54
- - `now`
55
- - `fromTimestamp`
56
- - `fromDate`
57
- - `fromISO`
58
- - `fromComponents`
59
- - Арифметика по времени:
60
- - `add`
61
- - `subtract`
62
- - Сравнение:
63
- - `isSame`
64
- - `isBefore`
65
- - `isAfter`
66
- - `isBetween`
50
+ - Фабричные функции: `now`, `fromTimestamp`, `fromDate`, `fromISO`, `fromComponents`
51
+ - Арифметика по времени: `add`, `subtract`
52
+ - Сравнение: `isSame`, `isBefore`, `isAfter`, `isBetween`
67
53
  - Форматирование по шаблону
68
- - Работа с часовыми поясами:
69
- - `setTimezone`
70
- - `getTimezoneOffset`
71
- - Интервалы:
72
- - `Interval`
73
- - `interval`
74
- - Длительности:
75
- - `Duration`
76
- - `duration`
77
- - Календарные утилиты:
78
- - `isLeapYear`
79
- - `daysInMonth`
54
+ - Работа с часовыми поясами: `setTimezone`, `getTimezoneOffset`
55
+ - Интервалы: `Interval`, `interval`
56
+ - Длительности: `Duration`, `duration`
57
+ - Календарные утилиты: `isLeapYear`, `daysInMonth`
80
58
 
81
59
  ## Установка
82
60
 
83
- ### Как зависимость проекта
84
-
85
61
  ```bash
86
62
  npm install @alexstukovnikov/oz-time
87
63
  ```
88
64
 
89
- ### Для локальной разработки
90
-
91
- ```bash
92
- npm install
93
- ```
94
-
95
65
  ## Быстрый старт
96
66
 
97
67
  ```js
@@ -114,107 +84,72 @@ const oneHour = duration(1, 'hour');
114
84
  console.log(oneHour.asMinutes()); // ожидаемый результат: 60
115
85
  ```
116
86
 
117
- ## Что использовать в каком случае
118
-
119
- | Сценарий | Что использовать | Почему |
120
- | ----------------------------------------- | --------------------------------------- | ------------------------------------------------------------------------------------ |
121
- | Нужен текущий момент времени | `now()` | Самый простой способ получить новый экземпляр `OzTime` для текущего момента. |
122
- | Есть Unix timestamp в миллисекундах | `fromTimestamp()` | Подходит для работы с временем из API, БД и системных источников. |
123
- | Есть нативный `Date` | `fromDate()` | Удобно интегрировать библиотеку в существующий код на JavaScript. |
124
- | Есть ISO-строка | `fromISO()` | Лучший вариант для внешних API и сериализованных значений времени. |
125
- | Нужно создать дату вручную из компонентов | `fromComponents()` | Подходит, когда год, месяц, день и время приходят по отдельности. |
126
- | Нужно прибавить или вычесть время | `add()` / `subtract()` | Возвращают новый экземпляр и не изменяют исходный объект. |
127
- | Нужно сравнить два значения | `isSame()` / `isBefore()` / `isAfter()` | Дают читаемый API для логики сравнения. |
128
- | Нужно проверить попадание в диапазон | `isBetween()` | Удобнее, чем писать проверку вручную. |
129
- | Нужно получить красивую строку | `format()` | Форматирование по шаблону с токенами. |
130
- | Нужно изменить отображаемый часовой пояс | `setTimezone()` | Меняет timezone у нового экземпляра, не меняя абсолютный момент времени. |
131
- | Нужно узнать смещение UTC | `getTimezoneOffset()` | Полезно для отображения, отладки и расчётов. |
132
- | Нужно описать диапазон времени | `Interval` / `interval()` | Подходит для проверки попадания, пересечений и длительности интервала. |
133
- | Нужно описать фиксированную длительность | `Duration` / `duration()` | Удобно для преобразования между миллисекундами, секундами, минутами, часами и днями. |
134
- | Нужно проверить високосный год | `isLeapYear()` | Простая календарная утилита. |
135
- | Нужно узнать число дней в месяце | `daysInMonth()` | Удобно для валидации и генерации дат. |
136
-
137
- ## Создание экземпляров
138
-
139
- ### `now(timezone?, locale?)`
140
-
141
- Создаёт экземпляр `OzTime` для текущего момента времени.
87
+ ### Цепочка операций
142
88
 
143
89
  ```js
144
- import { now } from '@alexstukovnikov/oz-time';
145
-
146
- const current = now('Europe/Moscow', 'ru-RU');
147
- console.log(current.getTimezone()); // ожидаемый результат: Europe/Moscow
148
- ```
149
-
150
- ### `fromTimestamp(timestamp, timezone?, locale?)`
151
-
152
- Создаёт экземпляр из Unix timestamp в миллисекундах.
153
-
154
- ```js
155
- import { fromTimestamp } from '@alexstukovnikov/oz-time';
156
-
157
- const time = fromTimestamp(1716638400000, 'UTC', 'ru-RU');
158
- console.log(time.toISOString()); // ожидаемый результат: 2024-05-25T12:00:00.000Z
159
- ```
160
-
161
- ### `fromDate(date, timezone?, locale?)`
162
-
163
- Создаёт экземпляр из объекта `Date`.
90
+ import { fromISO } from '@alexstukovnikov/oz-time';
164
91
 
165
- ```js
166
- import { fromDate } from '@alexstukovnikov/oz-time';
92
+ const result = fromISO('2024-05-25T12:00:00Z', 'UTC', 'ru-RU')
93
+ .add(1, 'day')
94
+ .add(2, 'hour')
95
+ .subtract(30, 'minute')
96
+ .setTimezone('Europe/Moscow')
97
+ .format('DD.MM.YYYY HH:mm:ss');
167
98
 
168
- const time = fromDate(new Date('2024-05-25T12:00:00Z'), 'UTC', 'ru-RU');
169
- console.log(time.toTimestamp()); // ожидаемый результат: 1716638400000
99
+ console.log(result);
170
100
  ```
171
101
 
172
- ### `fromISO(isoString, timezone?, locale?)`
102
+ ## Основные сценарии
103
+
104
+ | Сценарий | Что использовать | Почему |
105
+ | ----------------------------------------- | --------------------------------------- | ----------------------------------------------------------------------------------- |
106
+ | Нужен текущий момент времени | `now()` | Самый простой способ получить новый экземпляр `OzTime` для текущего момента |
107
+ | Есть Unix timestamp в миллисекундах | `fromTimestamp()` | Подходит для работы с временем из API, БД и системных источников |
108
+ | Есть нативный `Date` | `fromDate()` | Удобно интегрировать библиотеку в существующий JavaScript-код |
109
+ | Есть ISO-строка | `fromISO()` | Подходит для внешних API и сериализованных значений времени |
110
+ | Нужно создать дату вручную из компонентов | `fromComponents()` | Удобно, когда год, месяц, день и время приходят по отдельности |
111
+ | Нужно прибавить или вычесть время | `add()` / `subtract()` | Возвращают новый экземпляр и не изменяют исходный объект |
112
+ | Нужно сравнить два значения | `isSame()` / `isBefore()` / `isAfter()` | Дают читаемый API для логики сравнения |
113
+ | Нужно проверить попадание в диапазон | `isBetween()` | Удобнее, чем писать проверку вручную |
114
+ | Нужно получить строковое представление | `format()` | Форматирование по шаблону с токенами |
115
+ | Нужно изменить отображаемый часовой пояс | `setTimezone()` | Меняет timezone у нового экземпляра, не меняя абсолютный момент времени |
116
+ | Нужно узнать смещение относительно UTC | `getTimezoneOffset()` | Полезно для отображения, отладки и расчётов |
117
+ | Нужно описать диапазон времени | `Interval` / `interval()` | Подходит для проверки попадания, пересечений и длительности интервала |
118
+ | Нужно описать фиксированную длительность | `Duration` / `duration()` | Удобно для преобразования между миллисекундами, секундами, минутами, часами и днями |
119
+ | Нужно проверить високосный год | `isLeapYear()` | Простая календарная утилита |
120
+ | Нужно узнать число дней в месяце | `daysInMonth()` | Удобно для валидации и генерации дат |
173
121
 
174
- Создаёт экземпляр из ISO-строки.
122
+ ## Создание экземпляров
175
123
 
176
124
  ```js
177
- import { fromISO } from '@alexstukovnikov/oz-time';
125
+ import { now, fromTimestamp, fromDate, fromISO, fromComponents } from '@alexstukovnikov/oz-time';
178
126
 
179
- const time = fromISO('2024-05-25T12:00:00Z', 'UTC', 'ru-RU');
180
- console.log(time.format('DD.MM.YYYY HH:mm')); // ожидаемый результат: 25.05.2024 12:00
127
+ const a = now('Europe/Moscow', 'ru-RU');
128
+ const b = fromTimestamp(1716638400000, 'UTC', 'ru-RU');
129
+ const c = fromDate(new Date('2024-05-25T12:00:00Z'), 'UTC', 'ru-RU');
130
+ const d = fromISO('2024-05-25T12:00:00Z', 'UTC', 'ru-RU');
131
+ const e = fromComponents(2024, 5, 25, 12, 0, 0, 0, 'UTC', 'ru-RU');
181
132
  ```
182
133
 
183
- ### `fromComponents(year, month, day, hour?, minute?, second?, ms?, timezone?, locale?)`
184
-
185
- Создаёт экземпляр из отдельных компонентов даты и времени.
186
-
187
- ```js
188
- import { fromComponents } from '@alexstukovnikov/oz-time';
189
-
190
- const time = fromComponents(2024, 5, 25, 12, 0, 0, 0, 'UTC', 'ru-RU');
191
- console.log(time.toISOString()); // ожидаемый результат: 2024-05-25T12:00:00.000Z
192
- ```
134
+ - `now()` создаёт экземпляр `OzTime` для текущего момента времени.
135
+ - `fromTimestamp()` — создаёт экземпляр из Unix timestamp в миллисекундах.
136
+ - `fromDate()` создаёт экземпляр из объекта `Date`.
137
+ - `fromISO()` — создаёт экземпляр из ISO-строки.
138
+ - `fromComponents()` — создаёт экземпляр из отдельных компонентов даты и времени.
193
139
 
194
140
  ## Арифметика
195
141
 
196
142
  Все арифметические операции возвращают новый экземпляр `OzTime` и не изменяют исходный объект.
197
143
 
198
- ### Добавление времени
199
-
200
- ```js
201
- import { fromISO } from '@alexstukovnikov/oz-time';
202
-
203
- const time = fromISO('2024-05-25T12:00:00Z');
204
- const result = time.add(1, 'day');
205
-
206
- console.log(result.toISOString()); // ожидаемый результат: 2024-05-26T12:00:00.000Z
207
- ```
208
-
209
- ### Вычитание времени
144
+ ### Добавление и вычитание
210
145
 
211
146
  ```js
212
147
  import { fromISO } from '@alexstukovnikov/oz-time';
213
148
 
214
149
  const time = fromISO('2024-05-25T12:00:00Z');
215
- const result = time.subtract(2, 'hour');
216
150
 
217
- console.log(result.toISOString()); // ожидаемый результат: 2024-05-25T10:00:00.000Z
151
+ console.log(time.add(1, 'day').toISOString()); // ожидаемый результат: 2024-05-26T12:00:00.000Z
152
+ console.log(time.subtract(2, 'hour').toISOString()); // ожидаемый результат: 2024-05-25T10:00:00.000Z
218
153
  ```
219
154
 
220
155
  ### Разница между датами
@@ -241,54 +176,22 @@ console.log(result.toISOString()); // ожидаемый результат: 202
241
176
 
242
177
  ## Сравнение
243
178
 
244
- ### `isSame`
245
-
246
179
  ```js
247
180
  import { fromISO } from '@alexstukovnikov/oz-time';
248
181
 
249
182
  const a = fromISO('2024-05-25T12:00:00.100Z');
250
183
  const b = fromISO('2024-05-25T12:00:00.900Z');
184
+ const c = fromISO('2024-05-26T12:00:00Z');
251
185
 
252
186
  console.log(a.isSame(b, 'second')); // ожидаемый результат: true
253
- ```
254
-
255
- ### `isBefore`
256
-
257
- ```js
258
- import { fromISO } from '@alexstukovnikov/oz-time';
259
-
260
- const a = fromISO('2024-05-25T12:00:00Z');
261
- const b = fromISO('2024-05-26T12:00:00Z');
262
-
263
- console.log(a.isBefore(b)); // ожидаемый результат: true
264
- ```
265
-
266
- ### `isAfter`
267
-
268
- ```js
269
- import { fromISO } from '@alexstukovnikov/oz-time';
270
-
271
- const a = fromISO('2024-05-26T12:00:00Z');
272
- const b = fromISO('2024-05-25T12:00:00Z');
273
-
274
- console.log(a.isAfter(b)); // ожидаемый результат: true
275
- ```
276
-
277
- ### `isBetween`
278
-
279
- ```js
280
- import { fromISO } from '@alexstukovnikov/oz-time';
281
-
282
- const target = fromISO('2024-05-25T12:00:00Z');
283
- const start = fromISO('2024-05-25T10:00:00Z');
284
- const end = fromISO('2024-05-25T14:00:00Z');
285
-
286
- console.log(target.isBetween(start, end)); // ожидаемый результат: true
187
+ console.log(a.isBefore(c)); // ожидаемый результат: true
188
+ console.log(c.isAfter(a)); // ожидаемый результат: true
189
+ console.log(a.isBetween(a.subtract(1, 'day'), c)); // ожидаемый результат: true
287
190
  ```
288
191
 
289
192
  ## Форматирование
290
193
 
291
- Функция `format()` и метод `OzTime#format()` поддерживают шаблоны.
194
+ Функция `format()` и метод `OzTime#format()` поддерживают шаблоны форматирования.
292
195
 
293
196
  ```js
294
197
  import { fromISO } from '@alexstukovnikov/oz-time';
@@ -323,7 +226,9 @@ const time = fromISO('2024-05-25T12:00:00Z', 'Europe/Moscow', 'ru-RU');
323
226
  console.log(time.getTimezoneOffset()); // ожидаемый результат: 180
324
227
  ```
325
228
 
326
- ## Интервалы
229
+ ## Интервалы и длительности
230
+
231
+ ### Интервалы
327
232
 
328
233
  Интервал представляет диапазон между двумя экземплярами `OzTime`, включая границы.
329
234
 
@@ -350,7 +255,7 @@ const b = new Interval(fromISO('2024-05-25T11:00:00Z'), fromISO('2024-05-25T13:0
350
255
  console.log(a.overlaps(b)); // ожидаемый результат: true
351
256
  ```
352
257
 
353
- ## Длительности
258
+ ### Длительности
354
259
 
355
260
  `Duration` используется для работы с фиксированными единицами времени.
356
261
 
@@ -425,44 +330,6 @@ console.log(a.add(b).asMinutes()); // ожидаемый результат: 75
425
330
  | `SSS` | Миллисекунды | `123` |
426
331
  | `A` | AM/PM | `AM`, `PM` |
427
332
 
428
- ## Публичный API
429
-
430
- ### Core
431
-
432
- - `OzTime`
433
- - `now`
434
- - `fromTimestamp`
435
- - `fromDate`
436
- - `fromISO`
437
- - `fromComponents`
438
-
439
- ### Арифметика и сравнение
440
-
441
- - `add`
442
- - `subtract`
443
- - `isSame`
444
- - `isBefore`
445
- - `isAfter`
446
- - `isBetween`
447
-
448
- ### Форматирование и часовые пояса
449
-
450
- - `format`
451
- - `setTimezone`
452
- - `getTimezoneOffset`
453
-
454
- ### Интервалы и длительности
455
-
456
- - `Interval`
457
- - `interval`
458
- - `Duration`
459
- - `duration`
460
-
461
- ### Календарные утилиты
462
-
463
- - `isLeapYear`
464
- - `daysInMonth`
465
-
466
333
  ## FAQ
467
334
 
468
335
  ### Чем `fromISO()` отличается от `fromTimestamp()`?
@@ -504,63 +371,15 @@ console.log(a.add(b).asMinutes()); // ожидаемый результат: 75
504
371
 
505
372
  Используй `Interval`, когда есть начало и конец диапазона. Используй `Duration`, когда нужна именно фиксированная длина времени, например 2 часа, 30 минут или 7 дней.
506
373
 
507
- ## Разработка
508
-
509
- ### Запуск dev-режима
510
-
511
- ```bash
512
- npm run dev
513
- ```
514
-
515
- ### Сборка библиотеки
516
-
517
- ```bash
518
- npm run build
519
- ```
520
-
521
- ### Запуск тестов
522
-
523
- ```bash
524
- npm test
525
- ```
526
-
527
- ### Однократный запуск тестов
528
-
529
- ```bash
530
- npm run test:run
531
- ```
532
-
533
- ### Покрытие тестами
534
-
535
- ```bash
536
- npm run test:coverage
537
- ```
538
-
539
- ## Генерация документации
540
-
541
- ### Генерация HTML-документации JSDoc
542
-
543
- ```bash
544
- npm run docs
545
- ```
546
-
547
- ### Полная пересборка документации
548
-
549
- ```bash
550
- npm run docs:build
551
- ```
552
-
553
- После генерации документация будет находиться в папке `docs/`.
554
-
555
374
  ## Ограничения и особенности
556
375
 
557
- - Внутреннее значение времени хранится как Unix timestamp в миллисекундах.
558
- - Часовой пояс не меняет абсолютный момент времени, а влияет на форматирование и вычисление смещения.
559
- - Методы `add`, `subtract`, `setTimezone` и другие операции не изменяют текущий экземпляр, а возвращают новый.
560
- - `Duration` поддерживает только фиксированные единицы времени.
561
- - Календарная арифметика через `month` и `year` учитывает реальную длину месяцев.
562
- - Разница в `month` и `year` считается календарно, а не через точное число миллисекунд.
563
- - Поддержка часовых поясов зависит от `Intl` и доступных IANA time zone в среде выполнения.
376
+ - Внутреннее значение времени хранится как Unix timestamp в миллисекундах
377
+ - Часовой пояс не меняет абсолютный момент времени, а влияет на форматирование и вычисление смещения
378
+ - Методы `add`, `subtract`, `setTimezone` и другие операции не изменяют текущий экземпляр, а возвращают новый
379
+ - `Duration` поддерживает только фиксированные единицы времени
380
+ - Календарная арифметика через `month` и `year` учитывает реальную длину месяцев
381
+ - Разница в `month` и `year` считается календарно, а не через точное число миллисекунд
382
+ - Поддержка часовых поясов зависит от `Intl` и доступных IANA time zone в среде выполнения
564
383
 
565
384
  ## Лицензия
566
385
 
package/package.json CHANGED
@@ -1,48 +1,45 @@
1
- {
2
- "name": "@alexstukovnikov/oz-time",
3
- "version": "1.0.0",
4
- "description": "Lightweight JavaScript date-time library",
5
- "repository": {
6
- "type": "git",
7
- "url": "https://github.com/AlexStukovnikov/oz-time.git"
8
- },
9
- "type": "module",
10
- "main": "./dist/oz-time.cjs",
11
- "module": "./dist/oz-time.esm.js",
12
- "exports": {
13
- ".": {
14
- "import": "./dist/oz-time.esm.js",
15
- "require": "./dist/oz-time.cjs"
16
- }
17
- },
18
- "files": [
19
- "dist"
20
- ],
21
- "sideEffects": false,
22
- "scripts": {
23
- "dev": "vite",
24
- "build": "vite build",
25
- "test": "vitest",
26
- "test:run": "vitest run",
27
- "test:coverage": "vitest run --coverage",
28
- "docs": "jsdoc -c jsdoc.json",
29
- "docs:clean": "rimraf docs",
30
- "docs:build": "npm run docs:clean && npm run docs",
31
- "prepublishOnly": "npm run build"
32
- },
33
- "keywords": [
34
- "date",
35
- "time",
36
- "datetime"
37
- ],
38
- "author": "",
39
- "license": "ISC",
40
- "devDependencies": {
41
- "@vitest/coverage-v8": "^4.1.7",
42
- "@vitest/ui": "^4.1.7",
43
- "docdash": "^2.0.2",
44
- "jsdoc": "^4.0.5",
45
- "vite": "^8.0.14",
46
- "vitest": "^4.1.7"
47
- }
48
- }
1
+ {
2
+ "name": "@alexstukovnikov/oz-time",
3
+ "version": "1.0.2",
4
+ "description": "Lightweight JavaScript date-time library",
5
+ "repository": {
6
+ "type": "git",
7
+ "url": "https://github.com/AlexStukovnikov/oz-time.git"
8
+ },
9
+ "type": "module",
10
+ "main": "./src/index.js",
11
+ "exports": {
12
+ ".": "./src/index.js"
13
+ },
14
+ "files": [
15
+ "src",
16
+ "README.md"
17
+ ],
18
+ "sideEffects": false,
19
+ "scripts": {
20
+ "dev": "vite",
21
+ "build": "vite build",
22
+ "test": "vitest",
23
+ "test:run": "vitest run",
24
+ "test:coverage": "vitest run --coverage",
25
+ "docs": "jsdoc -c jsdoc.json",
26
+ "docs:clean": "rimraf docs",
27
+ "docs:build": "npm run docs:clean && npm run docs",
28
+ "prepublishOnly": "npm run build"
29
+ },
30
+ "keywords": [
31
+ "date",
32
+ "time",
33
+ "datetime"
34
+ ],
35
+ "author": "",
36
+ "license": "ISC",
37
+ "devDependencies": {
38
+ "@vitest/coverage-v8": "^4.1.7",
39
+ "@vitest/ui": "^4.1.7",
40
+ "docdash": "^2.0.2",
41
+ "jsdoc": "^4.0.5",
42
+ "vite": "^8.0.14",
43
+ "vitest": "^4.1.7"
44
+ }
45
+ }