-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.ts
67 lines (60 loc) · 1.7 KB
/
index.ts
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
import { AVG_DIM } from '../../constants';
import { when } from '../../error/when';
import { neither } from '../../filters/neither';
import { DateValue } from '../../types/DateValue';
import { isValidDate } from '../isValidDate';
import { ERROR_INVALID_DATE } from './constants';
export interface DiffDateResultUnits {
milliseconds: number;
seconds: number;
minutes: number;
hours: number;
days: number;
months: number;
years: number;
}
export interface DiffDateResult {
total: DiffDateResultUnits;
remain: DiffDateResultUnits;
raw: number;
inversed: boolean;
}
/**
* Returns total amount of time between two dates (years, months, days,
* hours etc).
*/
export const diffDate = (
from: DateValue,
to: DateValue
): DiffDateResult => {
when(neither(!isValidDate(from), !isValidDate(to))).drop(
ERROR_INVALID_DATE
);
const raw = new Date(to).valueOf() - new Date(from).valueOf();
const { abs, floor, round } = Math;
const milliseconds = abs(raw);
const total: DiffDateResultUnits = {
milliseconds,
seconds: round(milliseconds / 1000),
minutes: round(milliseconds / (1000 * 60)),
hours: round(milliseconds / (1000 * 60 * 60)),
days: round(milliseconds / (1000 * 60 * 60 * 24)),
months: round(milliseconds / (1000 * 60 * 60 * 24 * AVG_DIM)),
years: round(milliseconds / (1000 * 60 * 60 * 24 * AVG_DIM * 12)),
};
const remain: DiffDateResultUnits = {
milliseconds: total.milliseconds % 1000,
seconds: total.seconds % 60,
minutes: total.minutes % 60,
hours: total.hours % 24,
days: floor(total.days % AVG_DIM),
months: total.months % 12,
years: total.years,
};
return {
total,
remain,
raw,
inversed: raw < 0,
};
};