24 lines
1.0 KiB
TypeScript
24 lines
1.0 KiB
TypeScript
import { CliError } from "./errors.js";
|
|
|
|
export function parseTime(value: string, option: string): string {
|
|
const date = new Date(value);
|
|
if (Number.isNaN(date.getTime())) {
|
|
throw new CliError("CLI 参数错误", "INVALID_TIME", `${option} must be a valid ISO 8601 / RFC 3339 timestamp`, 2);
|
|
}
|
|
if (!/[zZ]|[+-]\d\d:\d\d$/.test(value)) {
|
|
throw new CliError("CLI 参数错误", "TIMEZONE_REQUIRED", `${option} must include an explicit timezone offset`, 2);
|
|
}
|
|
return value;
|
|
}
|
|
|
|
export function addMinutesPreservingOffset(value: string, minutes: number): string {
|
|
const match = value.match(/([+-])(\d\d):(\d\d)$/);
|
|
const end = new Date(new Date(value).getTime() + minutes * 60_000);
|
|
if (!match) return end.toISOString().replace(".000Z", "Z");
|
|
const sign = match[1] === "+" ? 1 : -1;
|
|
const offsetMinutes = sign * (Number(match[2]) * 60 + Number(match[3]));
|
|
const local = new Date(end.getTime() + offsetMinutes * 60_000);
|
|
return `${local.toISOString().replace(".000Z", "")}${match[1]}${match[2]}:${match[3]}`;
|
|
}
|
|
|