46 lines
1.2 KiB
TypeScript
46 lines
1.2 KiB
TypeScript
|
import dayjs from "@calcom/dayjs";
|
||
|
|
||
|
const ISO8601_OFFSET_FORMAT = /^(.*)([+-])(\d{2}):(\d{2})|(Z)$/;
|
||
|
|
||
|
// @see https://github.com/iamkun/dayjs/issues/651#issuecomment-763033265
|
||
|
// decorates dayjs in order to keep the utcOffset of the given date string
|
||
|
// ; natively dayjs auto-converts to local time & losing utcOffset info.
|
||
|
export function parseZone(
|
||
|
date?: dayjs.ConfigType,
|
||
|
format?: dayjs.OptionType,
|
||
|
locale?: string,
|
||
|
strict?: boolean
|
||
|
) {
|
||
|
if (typeof date !== "string") {
|
||
|
return dayjs(date, format, locale, strict);
|
||
|
}
|
||
|
const match = date.match(ISO8601_OFFSET_FORMAT);
|
||
|
if (match === null) {
|
||
|
return;
|
||
|
}
|
||
|
if (match[0] === "Z") {
|
||
|
return dayjs(
|
||
|
date,
|
||
|
{
|
||
|
utc: true,
|
||
|
...(typeof format === "string" ? { format } : { ...format }),
|
||
|
},
|
||
|
locale,
|
||
|
strict
|
||
|
);
|
||
|
}
|
||
|
const [, dateTime, sign, tzHour, tzMinute] = match;
|
||
|
const uOffset: number = parseInt(tzHour) * 60 + parseInt(tzMinute, 10);
|
||
|
const offset = sign === "+" ? uOffset : -uOffset;
|
||
|
|
||
|
return dayjs(
|
||
|
dateTime,
|
||
|
{
|
||
|
$offset: offset,
|
||
|
...(typeof format === "string" ? { format } : { ...format }),
|
||
|
} as dayjs.OptionType & { $offset: number },
|
||
|
locale,
|
||
|
strict
|
||
|
);
|
||
|
}
|