UNPKG

@leancodepl/api-date-dayjs

Version:

Day.js integration for API date type conversion

93 lines (82 loc) 2.41 kB
export * from '@leancodepl/api-date'; import dayjs from 'dayjs'; import customParseFormat from 'dayjs/plugin/customParseFormat'; import utc from 'dayjs/plugin/utc'; import duration from 'dayjs/plugin/duration'; import { parseApiTimeSpan } from '@leancodepl/api-date-utils'; dayjs.extend(customParseFormat); function fromApiTime(time) { if (!time) { return undefined; } return dayjs(time, "HH:mm:ss.SSS"); } function toApiTime(time) { if (!time) { return undefined; } return time.format("HH:mm:ss.SSS"); } function fromApiDate(date) { if (!date) { return undefined; } return dayjs(date); } dayjs.extend(utc); /** * This function keeps local time (excluding timezone/offset) but sets its offset to UTC */ function dropLocalOffset(time) { return time.clone().utc(true); } function toApiDate(date) { if (!date) { return undefined; } return dropLocalOffset(date).startOf("day").format("YYYY-MM-DD"); } dayjs.extend(customParseFormat); function fromApiDateTimeOffset(datetime) { if (!datetime) { return undefined; } return dayjs(datetime, "YYYY-MM-DDTHH:mm:ss.SSSZ"); } function toApiDateTimeOffset(time) { if (!time) { return undefined; } return time.format("YYYY-MM-DDTHH:mm:ss.SSSZ"); } dayjs.extend(duration); function fromApiTimeSpan(timeSpan) { if (!timeSpan) { return undefined; } const parsedDuration = parseApiTimeSpan(timeSpan); const isNegative = parsedDuration.sign === "-"; const dayjsDuration = dayjs.duration(parsedDuration.values); if (isNegative) { return dayjs.duration(-dayjsDuration.asMilliseconds()); } return dayjsDuration; } dayjs.extend(duration); function toApiTimeSpan(duration) { if (!duration) { return undefined; } const isNegative = duration.asMilliseconds() < 0; const absDuration = dayjs.duration(Math.abs(duration.asMilliseconds())); const days = Math.floor(absDuration.asDays()); let stringTimeSpan = ""; if (isNegative) { stringTimeSpan += "-"; } if (days > 0) { stringTimeSpan += `${days}.`; } stringTimeSpan += absDuration.format("HH:mm:ss.SSS"); return stringTimeSpan; } export { dropLocalOffset, fromApiDate, fromApiDateTimeOffset, fromApiTime, fromApiTimeSpan, toApiDate, toApiDateTimeOffset, toApiTime, toApiTimeSpan };