chrono-node
Version:
A natural language date parser in Javascript
119 lines • 4.09 kB
JavaScript
export function addDuration(ref, duration) {
let date = new Date(ref);
if (duration["y"]) {
duration["year"] = duration["y"];
delete duration["y"];
}
if (duration["mo"]) {
duration["month"] = duration["mo"];
delete duration["mo"];
}
if (duration["M"]) {
duration["month"] = duration["M"];
delete duration["M"];
}
if (duration["w"]) {
duration["week"] = duration["w"];
delete duration["w"];
}
if (duration["d"]) {
duration["day"] = duration["d"];
delete duration["d"];
}
if (duration["h"]) {
duration["hour"] = duration["h"];
delete duration["h"];
}
if (duration["m"]) {
duration["minute"] = duration["m"];
delete duration["m"];
}
if (duration["s"]) {
duration["second"] = duration["s"];
delete duration["s"];
}
if (duration["ms"]) {
duration["millisecond"] = duration["ms"];
delete duration["ms"];
}
if ("year" in duration) {
const floor = Math.floor(duration["year"]);
date.setFullYear(date.getFullYear() + floor);
const remainingFraction = duration["year"] - floor;
if (remainingFraction > 0) {
duration.month = duration?.month ?? 0;
duration.month += remainingFraction * 12;
}
}
if ("quarter" in duration) {
const floor = Math.floor(duration["quarter"]);
date.setMonth(date.getMonth() + floor * 3);
}
if ("month" in duration) {
const floor = Math.floor(duration["month"]);
date.setMonth(date.getMonth() + floor);
const remainingFraction = duration["month"] - floor;
if (remainingFraction > 0) {
duration.week = duration?.week ?? 0;
duration.week += remainingFraction * 4;
}
}
if ("week" in duration) {
const floor = Math.floor(duration["week"]);
date.setDate(date.getDate() + floor * 7);
const remainingFraction = duration["week"] - floor;
if (remainingFraction > 0) {
duration.day = duration?.day ?? 0;
duration.day += Math.round(remainingFraction * 7);
}
}
if ("day" in duration) {
const floor = Math.floor(duration["day"]);
date.setDate(date.getDate() + floor);
const remainingFraction = duration["day"] - floor;
if (remainingFraction > 0) {
duration.hour = duration?.hour ?? 0;
duration.hour += Math.round(remainingFraction * 24);
}
}
if ("hour" in duration) {
const floor = Math.floor(duration["hour"]);
date.setHours(date.getHours() + floor);
const remainingFraction = duration["hour"] - floor;
if (remainingFraction > 0) {
duration.minute = duration?.minute ?? 0;
duration.minute += Math.round(remainingFraction * 60);
}
}
if ("minute" in duration) {
const floor = Math.floor(duration["minute"]);
date.setMinutes(date.getMinutes() + floor);
const remainingFraction = duration["minute"] - floor;
if (remainingFraction > 0) {
duration.second = duration?.second ?? 0;
duration.second += Math.round(remainingFraction * 60);
}
}
if ("second" in duration) {
const floor = Math.floor(duration["second"]);
date.setSeconds(date.getSeconds() + floor);
const remainingFraction = duration["second"] - floor;
if (remainingFraction > 0) {
duration.millisecond = duration?.millisecond ?? 0;
duration.millisecond += Math.round(remainingFraction * 1000);
}
}
if ("millisecond" in duration) {
const floor = Math.floor(duration["millisecond"]);
date.setMilliseconds(date.getMilliseconds() + floor);
}
return date;
}
export function reverseDuration(duration) {
const reversed = {};
for (const key in duration) {
reversed[key] = -duration[key];
}
return reversed;
}
//# sourceMappingURL=duration.js.map