refactor(cli): split tjwater cli modules
This commit is contained in:
@@ -0,0 +1,23 @@
|
||||
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]}`;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user