Skip to content

Commit e47efab

Browse files
committed
Add toTemporalFromClockTime function
1 parent ee32ddd commit e47efab

4 files changed

+92
-0
lines changed

src/datetime/_formatDateIso.ts

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
export function formatDateIso(date: Date) {
2+
const year = date.getFullYear().toString();
3+
const month = (date.getMonth() + 1).toString().padStart(2, "0");
4+
const day = date.getDate().toString().padStart(2, "0");
5+
const hour = date.getHours().toString().padStart(2, "0");
6+
const minute = date.getMinutes().toString().padStart(2, "0");
7+
const second = date.getSeconds().toString().padStart(2, "0");
8+
const millisecond = date.getMilliseconds().toString().padStart(3, "0");
9+
10+
const offset = date.getTimezoneOffset();
11+
12+
const offsetHours = Math.floor(Math.abs(offset) / 60)
13+
.toString()
14+
.padStart(2, "0");
15+
const offsetMinutes = (Math.abs(offset) % 60).toString().padStart(2, "0");
16+
const offsetString = `${offset > 0 ? "-" : "+"}${offsetHours}:${offsetMinutes}`;
17+
18+
return `${year}-${month}-${day}T${hour}:${minute}:${second}.${millisecond}${offsetString}`;
19+
}

src/datetime/index.ts

+1
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,4 @@ export { isAfter } from "./isAfter.js";
77
export { isBefore } from "./isBefore.js";
88
export { latest } from "./latest.js";
99
export { toDateFromClockTime } from "./toDateFromClockTime.js";
10+
export { toTemporalFromClockTime } from "./toTemporalFromClockTime.js";
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
import { Temporal } from "@js-temporal/polyfill";
2+
import { expect, test } from "vitest";
3+
4+
import { toTemporalFromClockTime } from "./toTemporalFromClockTime.js";
5+
6+
test("to PlainDate", () => {
7+
expect(
8+
toTemporalFromClockTime(
9+
new Date("2024-01-01T00:00:00"),
10+
Temporal.PlainDate,
11+
),
12+
).toEqual(Temporal.PlainDate.from("2024-01-01"));
13+
});
14+
15+
test("to PlainTime", () => {
16+
expect(
17+
toTemporalFromClockTime(
18+
new Date("2024-01-01T00:00:00"),
19+
Temporal.PlainTime,
20+
),
21+
).toEqual(Temporal.PlainTime.from("00:00:00"));
22+
});
23+
24+
test("to PlainDateTime", () => {
25+
expect(
26+
toTemporalFromClockTime(
27+
new Date("2024-01-01T00:00:00"),
28+
Temporal.PlainDateTime,
29+
),
30+
).toEqual(Temporal.PlainDateTime.from("2024-01-01T00:00:00"));
31+
});
32+
33+
test("to PlainYearMonth", () => {
34+
expect(
35+
toTemporalFromClockTime(
36+
new Date("2024-01-01T00:00:00"),
37+
Temporal.PlainYearMonth,
38+
),
39+
).toEqual(Temporal.PlainYearMonth.from("2024-01"));
40+
});
41+
42+
test("to PlainMonthDay", () => {
43+
expect(
44+
toTemporalFromClockTime(
45+
new Date("2024-01-01T00:00:00"),
46+
Temporal.PlainMonthDay,
47+
),
48+
).toEqual(Temporal.PlainMonthDay.from("01-01"));
49+
});
+23
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import type { Temporal } from "../types.js";
2+
import { formatDateIso } from "./_formatDateIso.js";
3+
4+
/**
5+
* Returns Temporal instance which represents clock (local) time of given date.
6+
* @param date `Date` object
7+
* @param TemporalClass Temporal class (such as `Temporal.Plaindate`) which will be returned
8+
* @returns an instance of Temporal class specified in `temporalClass` argument, which represents the clock time of original date
9+
*/
10+
export function toTemporalFromClockTime<
11+
TemporalClassType extends
12+
| typeof Temporal.PlainDate
13+
| typeof Temporal.PlainTime
14+
| typeof Temporal.PlainDateTime
15+
| typeof Temporal.PlainYearMonth
16+
| typeof Temporal.PlainMonthDay,
17+
>(
18+
date: Date,
19+
TemporalClass: TemporalClassType,
20+
): InstanceType<TemporalClassType> {
21+
const dateIso = formatDateIso(date);
22+
return TemporalClass.from(dateIso) as InstanceType<TemporalClassType>;
23+
}

0 commit comments

Comments
 (0)