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
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
|
import { assertEquals, assertMatch } from "@std/assert";
import { describe, it } from "@std/testing/bdd";
import {
getRelativeTimeUnit,
toIso8601Full,
toIso8601FullUTC,
} from "./datetime.ts";
describe("toIso8601Full", () => {
it("formats current local time with offset", () => {
const date = new Date();
const result = toIso8601Full(date);
assertMatch(
result,
/^[+-]\d{6}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}(Z|[+-]\d{2}:\d{2})$/,
);
});
it("handles dates before year 0 (BC)", () => {
const date = new Date(-2000, 0, 1, 0, 0, 0, 0);
const result = toIso8601Full(date);
assertMatch(result, /^-\d{6}-01-01T00:00:00\.000(Z|[+-]\d{2}:\d{2})$/);
});
it("pads components correctly", () => {
const date = new Date(7, 0, 2, 3, 4, 5, 6);
const result = toIso8601Full(date);
assertMatch(result, /^\+001907-01-02T03:04:05\.006(Z|[+-]\d{2}:\d{2})$/);
});
it("handles positive and negative timezone offsets", () => {
const date = new Date("2025-06-17T12:00:00Z");
const result = toIso8601Full(date);
assertMatch(
result,
/^[+-]\d{6}-06-17T\d{2}:\d{2}:\d{2}\.\d{3}(Z|[+-]\d{2}:\d{2})$/,
);
});
});
describe("toIso8601FullUTC", () => {
it("always formats in UTC with 'Z'", () => {
const date = new Date(Date.UTC(2025, 11, 31, 23, 59, 59, 999));
const result = toIso8601FullUTC(date);
assertEquals(result, "+002025-12-31T23:59:59.999Z");
});
it("pads milliseconds and components correctly", () => {
const date = new Date(Date.UTC(7, 0, 2, 3, 4, 5, 6));
const result = toIso8601FullUTC(date);
assertEquals(result, "+001907-01-02T03:04:05.006Z");
});
it("handles BC dates (negative years)", () => {
const date = new Date(Date.UTC(-44, 2, 15, 12, 0, 0, 0));
const result = toIso8601FullUTC(date);
assertMatch(result, /^-\d{6}-03-15T12:00:00\.000Z$/);
});
});
describe("getRelativeTimeUnit", () => {
const now = new Date();
it("returns seconds for differences under a minute", () => {
const future = new Date(now.getTime() + 45 * 1000);
const [value, unit] = getRelativeTimeUnit(future);
assertEquals(unit, "second");
assertEquals(value, 1);
});
it("returns minutes for differences under an hour but over a minute", () => {
const future = new Date(now.getTime() + 15 * 60 * 1000);
const [value, unit] = getRelativeTimeUnit(future);
assertEquals(unit, "minute");
assertEquals(value, 15);
});
it("returns hours for differences under a day but over an hour", () => {
const past = new Date(now.getTime() - 3.2 * 60 * 60 * 1000);
const [value, unit] = getRelativeTimeUnit(past);
assertEquals(unit, "hour");
assertEquals(value, -3);
});
it("returns days for differences under a week but over a day", () => {
const past = new Date(now.getTime() - 2.5 * 24 * 60 * 60 * 1000);
const [value, unit] = getRelativeTimeUnit(past);
assertEquals(unit, "day");
assertEquals(value, -3);
});
it("returns weeks for differences under a month but over a week", () => {
const future = new Date(now.getTime() + 2.3 * 7 * 24 * 60 * 60 * 1000);
const [value, unit] = getRelativeTimeUnit(future);
assertEquals(unit, "week");
assertEquals(value, 2);
});
it("returns months for differences under a quarter but over a month", () => {
const past = new Date(now.getTime() - 1.5 * 30 * 24 * 60 * 60 * 1000);
const [value, unit] = getRelativeTimeUnit(past);
assertEquals(unit, "month");
assertEquals(value, -2);
});
it("returns quarters for differences under a year but over a quarter", () => {
const future = new Date(now.getTime() + 5 * 30 * 24 * 60 * 60 * 1000);
const [value, unit] = getRelativeTimeUnit(future);
assertEquals(unit, "quarter");
assertEquals(value, 2);
});
it("returns years for differences over a year", () => {
const past = new Date(now.getTime() - 3.4 * 365 * 24 * 60 * 60 * 1000);
const [value, unit] = getRelativeTimeUnit(past);
assertEquals(unit, "year");
assertEquals(value, -3);
});
});
|