vremel
Version:
JavaScript date utility library for Temporal API
68 lines • 2.58 kB
JavaScript
import { isInstantConstructor, isZonedDateTimeConstructor, } from "../type-utils.js";
import { formatExactTimeIso } from "./_formatExactTimeIso.js";
import { getDayOfWeekFromYmd } from "./_getDayOfWeekFromYmd.js";
import { getDayOfWeekNumberFromAbbreviation } from "./_getDayOfWeekNumberFromAbbreviation.js";
import { getMonthNumberFromAbbreviation } from "./_getMonthNumberFromAbbreviation.js";
const regex = /^([A-Za-z]{3}), (\d\d) ([A-Za-z]{3}) (\d{4}) (\d\d):(\d\d):(\d\d) GMT$/;
function parse(date) {
const result = regex.exec(date);
if (result === null) {
throw new Error("Invalid format");
}
const [, dayOfWeek, day, monthName, year, hour, minute, second] = result;
if (dayOfWeek === undefined ||
day === undefined ||
monthName === undefined ||
year === undefined ||
hour === undefined ||
minute === undefined ||
second === undefined) {
throw new Error("something wrong");
}
const y = parseInt(year);
const m = getMonthNumberFromAbbreviation(monthName);
const d = parseInt(day);
const weekNum = getDayOfWeekNumberFromAbbreviation(dayOfWeek);
if (getDayOfWeekFromYmd(y, m, d) !== weekNum) {
throw new Error(`Wrong day of week: ${dayOfWeek}`);
}
return [y, m, d, parseInt(hour), parseInt(minute), parseInt(second)];
}
/**
* Creates Temporal object from datetime string in RFC 7231's format (HTTP date format)
* such as `Mon, 01 Jan 2024 01:23:45 GMT`.
* This function doesn't support obsoleted formats.
*
* @param date datetime string in RFC 7231's format
* @param TemporalClass Temporal class (such as `Temporal.PlainDateTime` or `Temporal.Instant`) which will be returned
* @returns an instance of Temporal class specified in `TemporalClass` argument
*/
export function fromRfc7231(date, TemporalClass) {
const result = parse(date);
const [year, month, day, hour, minute, second] = result;
if (isInstantConstructor(TemporalClass)) {
return TemporalClass.from(formatExactTimeIso(year, month, day, hour, minute, second, 0, "Z"));
}
if (isZonedDateTimeConstructor(TemporalClass)) {
return TemporalClass.from({
year,
month,
day,
hour,
minute,
second,
calendarId: "iso8601",
timeZone: "UTC",
});
}
return TemporalClass.from({
year,
month,
day,
hour,
minute,
second,
calendarId: "iso8601",
});
}
//# sourceMappingURL=fromRfc7231.js.map