@leancodepl/api-date-dayjs
Version:
Day.js integration for API date type conversion
93 lines (82 loc) • 2.41 kB
JavaScript
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 };