Skip to content

Commit cafa3a2

Browse files
committed
Use dedicated helper function to pad leading zeros
1 parent 07859f0 commit cafa3a2

7 files changed

+48
-32
lines changed

src/datetime/_formatDateIso.ts

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import { padLeadingZeros } from "./_padLeadingZeros.js";
2+
13
export function formatDateIso(year: number, month: number, day: number) {
2-
return `${year.toString()}-${month.toString().padStart(2, "0")}-${day.toString().padStart(2, "0")}`;
4+
return `${year.toString()}-${padLeadingZeros(month, 2)}-${padLeadingZeros(day, 2)}`;
35
}

src/datetime/_formatExactTimeIso.ts

+5-4
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { formatDateIso } from "./_formatDateIso.js";
2+
import { padLeadingZeros } from "./_padLeadingZeros.js";
23

34
export function formatExactTimeIso(
45
year: number,
@@ -10,9 +11,9 @@ export function formatExactTimeIso(
1011
millisecond: number,
1112
offsetString: string,
1213
) {
13-
const hourStr = hour.toString().padStart(2, "0");
14-
const minuteStr = minute.toString().padStart(2, "0");
15-
const secondStr = second.toString().padStart(2, "0");
16-
const millisecondStr = millisecond.toString().padStart(3, "0");
14+
const hourStr = padLeadingZeros(hour, 2);
15+
const minuteStr = padLeadingZeros(minute, 2);
16+
const secondStr = padLeadingZeros(second, 2);
17+
const millisecondStr = padLeadingZeros(millisecond, 3);
1718
return `${formatDateIso(year, month, day)}T${hourStr}:${minuteStr}:${secondStr}.${millisecondStr}${offsetString}`;
1819
}

src/datetime/_formatIsoFromDateObject.ts

+3-4
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { formatExactTimeIso } from "./_formatExactTimeIso.js";
2+
import { padLeadingZeros } from "./_padLeadingZeros.js";
23

34
export function formatIsoFromDateObject(date: Date) {
45
const year = date.getFullYear();
@@ -11,10 +12,8 @@ export function formatIsoFromDateObject(date: Date) {
1112

1213
const offset = date.getTimezoneOffset();
1314

14-
const offsetHours = Math.floor(Math.abs(offset) / 60)
15-
.toString()
16-
.padStart(2, "0");
17-
const offsetMinutes = (Math.abs(offset) % 60).toString().padStart(2, "0");
15+
const offsetHours = padLeadingZeros(Math.floor(Math.abs(offset) / 60), 2);
16+
const offsetMinutes = padLeadingZeros(Math.abs(offset) % 60, 2);
1817
const offsetString = `${offset > 0 ? "-" : "+"}${offsetHours}:${offsetMinutes}`;
1918

2019
return formatExactTimeIso(

src/datetime/_padLeadingZeros.test.ts

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import { expect, test } from "vitest";
2+
3+
import { padLeadingZeros } from "./_padLeadingZeros.js";
4+
5+
test("padLeadingZeros", () => {
6+
expect(padLeadingZeros(3, 2)).toEqual("03");
7+
expect(padLeadingZeros(23, 2)).toEqual("23");
8+
});

src/datetime/_padLeadingZeros.ts

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
export function padLeadingZeros(
2+
num: number | string,
3+
maxLength: number,
4+
): string {
5+
return num.toString().padStart(maxLength, "0");
6+
}

src/datetime/formatRfc7231.ts

+6-5
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { isInstant } from "../type-utils.js";
22
import type { Temporal } from "../types.js";
33
import { getDayOfWeekAbbreviationFromNumber } from "./_getDayOfWeekAbbreviationFromNumber.js";
44
import { getMonthAbbreviationFromNumber } from "./_getMonthAbbreviationFromNumber.js";
5+
import { padLeadingZeros } from "./_padLeadingZeros.js";
56

67
/**
78
* Returns a string in RFC 7231's format which represents an exact time of given temporal object.
@@ -15,11 +16,11 @@ export function formatRfc7231(
1516
// timeZone: 'UTC', calendar: 'iso8601'
1617
const zdt = (isInstant(dt) ? dt : dt.toInstant()).toZonedDateTimeISO("UTC");
1718
const dayOfWeek = getDayOfWeekAbbreviationFromNumber(zdt.dayOfWeek);
18-
const year = zdt.year.toString().padStart(4, "0");
19-
const day = zdt.day.toString().padStart(2, "0");
19+
const year = padLeadingZeros(zdt.year, 4);
20+
const day = padLeadingZeros(zdt.day, 2);
2021
const month = getMonthAbbreviationFromNumber(zdt.month);
21-
const hour = zdt.hour.toString().padStart(2, "0");
22-
const minute = zdt.minute.toString().padStart(2, "0");
23-
const second = zdt.second.toString().padStart(2, "0");
22+
const hour = padLeadingZeros(zdt.hour, 2);
23+
const minute = padLeadingZeros(zdt.minute, 2);
24+
const second = padLeadingZeros(zdt.second, 2);
2425
return `${dayOfWeek}, ${day} ${month} ${year} ${hour}:${minute}:${second} GMT`;
2526
}

src/datetime/formatWithoutLocale.ts

+17-18
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { getTypeName, isPlainMonthDay } from "../type-utils.js";
22
import type { Temporal } from "../types.js";
3+
import { padLeadingZeros } from "./_padLeadingZeros.js";
34
import { secondsToHms } from "./_secondsToHms.js";
45

56
type DateTime =
@@ -26,11 +27,11 @@ function year(
2627
return year;
2728
}
2829
if (token === "yy") {
29-
return (dateTime.year % 100).toString().padStart(2, "0");
30+
return padLeadingZeros(dateTime.year % 100, 2);
3031
}
3132
if (/^y+$/.test(token)) {
3233
if (token.length > year.length) {
33-
return year.padStart(token.length, "0");
34+
return padLeadingZeros(year, token.length);
3435
} else {
3536
return year;
3637
}
@@ -90,7 +91,7 @@ function month(
9091
return month.toString();
9192
}
9293
if (token === "MM") {
93-
return month.toString().padStart(2, "0");
94+
return padLeadingZeros(month, 2);
9495
}
9596

9697
throw new Error(`Invalid token: ${token}`);
@@ -111,7 +112,7 @@ function day(
111112
return dateTime.day.toString();
112113
}
113114
if (token === "dd") {
114-
return dateTime.day.toString().padStart(2, "0");
115+
return padLeadingZeros(dateTime.day, 2);
115116
}
116117
throw new Error(`Invalid token: ${token}`);
117118
}
@@ -120,20 +121,18 @@ function hour(dateTime: DateTime, token: string): string {
120121
if (!("hour" in dateTime)) {
121122
throw new Error(`${getTypeName(dateTime)} doesn't have hour info`);
122123
}
123-
const hour12 = (
124-
dateTime.hour % 12 === 0 ? 12 : dateTime.hour % 12
125-
).toString();
124+
const hour12 = dateTime.hour % 12 === 0 ? 12 : dateTime.hour % 12;
126125
if (token === "h") {
127-
return hour12;
126+
return hour12.toString();
128127
}
129128
if (token === "hh") {
130-
return hour12.padStart(2, "0");
129+
return padLeadingZeros(hour12, 2);
131130
}
132131
if (token === "H") {
133132
return dateTime.hour.toString();
134133
}
135134
if (token === "HH") {
136-
return dateTime.hour.toString().padStart(2, "0");
135+
return padLeadingZeros(dateTime.hour, 2);
137136
}
138137
throw new Error(`Invalid token: ${token}`);
139138
}
@@ -146,7 +145,7 @@ function minute(dateTime: DateTime, token: string): string {
146145
return dateTime.minute.toString();
147146
}
148147
if (token === "mm") {
149-
return dateTime.minute.toString().padStart(2, "0");
148+
return padLeadingZeros(dateTime.minute, 2);
150149
}
151150
throw new Error(`Invalid token: ${token}`);
152151
}
@@ -159,7 +158,7 @@ function second(dateTime: DateTime, token: string): string {
159158
return dateTime.second.toString();
160159
}
161160
if (token === "ss") {
162-
return dateTime.second.toString().padStart(2, "0");
161+
return padLeadingZeros(dateTime.second, 2);
163162
}
164163
throw new Error(`Invalid token: ${token}`);
165164
}
@@ -179,9 +178,9 @@ function fractionalSecond(dateTime: DateTime, token: string): string {
179178
if (!/^S+$/.test(token)) {
180179
throw new Error(`Invalid token: ${token}`);
181180
}
182-
const millisec = dateTime.millisecond.toString().padStart(3, "0");
183-
const microsec = dateTime.microsecond.toString().padStart(3, "0");
184-
const nanosec = dateTime.nanosecond.toString().padStart(3, "0");
181+
const millisec = padLeadingZeros(dateTime.millisecond, 3);
182+
const microsec = padLeadingZeros(dateTime.microsecond, 3);
183+
const nanosec = padLeadingZeros(dateTime.nanosecond, 3);
185184
const fracSec = `${millisec}${microsec}${nanosec}`;
186185

187186
if (token.length >= fracSec.length) {
@@ -203,9 +202,9 @@ function offset(dateTime: DateTime, token: string) {
203202
}
204203
const sign = offsetSeconds < 0 ? "-" : "+";
205204
const hms = secondsToHms(Math.abs(offsetSeconds));
206-
const hour = hms.hour.toString().padStart(2, "0");
207-
const minute = hms.minute.toString().padStart(2, "0");
208-
const second = hms.second.toString().padStart(2, "0");
205+
const hour = padLeadingZeros(hms.hour, 2);
206+
const minute = padLeadingZeros(hms.minute, 2);
207+
const second = padLeadingZeros(hms.second, 2);
209208
if (token === "X" || token === "x") {
210209
return hms.minute === 0 ? `${sign}${hour}` : `${sign}${hour}${minute}`;
211210
}

0 commit comments

Comments
 (0)