@luke-zhang-04/dateplus
Version:
A simple program to assist with date manipulation
199 lines • 13.9 kB
JavaScript
/**
* DatePlus A simple program to assist with date manipulation
*
* @license MIT
* @version 4.0.0-beta2
* @author Luke Zhang luke-zhang-04.github.io
* @copyright Copyright (C) 2020 - 2021 Luke Zhang
*/
import { daysReference, monthsReference, oneDay, oneHour, oneMinute } from "./values";
/* eslint-disable id-length */
/**
* Reference to months of a year, zero indexed
*/
const keysReference = {
y: "year",
m: "month",
d: "day",
};
/* eslint-enable id-length */
/**
* Add's 0s to date (e.g 2020/4/3 => 2020/04/03)
*
* @param date - String date to format
* @param seperator - Char the date is seperatred by
* @returns - Date with zeros
*/
export const addZeros = (date, seperator = "/") => {
const splitDate = date.split(seperator);
const newDateValues = splitDate.map((section) => section.length < 2 ? `0${section}` : section);
return newDateValues.join(seperator);
};
/**
* Format date into a string in the form YYYY{seperator}MM{seperator}DD
*
* @param date - Date object to format
* @param format - Format of string date
* @param seperator - String to seperate date values with
* @returns Formatted date
*/
export const formatDate = (date, format = "y:m:d", seperator = "/") => {
const month = (date.getMonth() + 1).toString();
const day = date.getDate().toString();
/* eslint-disable id-length */
const year = date.getFullYear().toString();
const values = {
m: month,
d: day,
y: year,
};
/* eslint-enable id-length */
const formatArray = format.split(":");
return formatArray.map((val) => values[val]).join(seperator);
};
/**
* Gets date values and outputs an object
*
* @param date - Date to extract values from, months zero indexed
* @param format - Format of string date
* @param seperator - Seperator the date works with; leave auto for auto detection, limited to 1 char
* @returns Object with all values
*/
export const getDateValues = (date, format = "y:m:d", seperator = "auto") => {
let _seperator = "/";
if (seperator === "auto") {
for (const letter of date) {
if (isNaN(Number(letter))) {
_seperator = letter;
break;
}
}
}
else {
_seperator = seperator;
}
const splitDate = date.split(_seperator);
const dateFormat = format.split(":");
const output = {};
for (let index = 0; index < 3; index++) {
const key = keysReference[dateFormat[index]];
output[key] = Number(splitDate[index]);
}
return output;
};
/**
* Converts numerical day of week into word form (e.g 0 => "Sunday")
*
* @param numerical - Numerical day of week, 0 indexed (0-6)
* @returns Stringed day of week
*/
export const getWordDay = (numerical) => daysReference[numerical];
/**
* Converts numerical month into word form (e.g 0 => "January")
*
* @param numerical - Numerical day of week, 0 indexed (0-11)
* @returns Stringed worded month
*/
export const getWordMonth = (numerical) => monthsReference[numerical];
/**
* Calculates number of elapsed days between date1 and date2
*
* @param date1 - Starting date object to calculate
* @param date2 - Ending date object to calculate
* @returns - Number of elapsed days
*/
export const getElapsedDays = (date1, date2) => Math.round((date1.getTime() - date2.getTime()) / oneDay) * -1;
/**
* Calculates number of elapsed hours between date1 and date2
*
* @param date1 - Starting date object to calculate
* @param date2 - Ending date object to calculate
* @returns - Number of elapsed hours
*/
export const getElapsedHours = (date1, date2) => Math.round((date1.getTime() - date2.getTime()) / oneHour) * -1;
/**
* Calculates number of elapsed minutes between date1 and date2
*
* @param date1 - Starting date object to calculate
* @param date2 - Ending date object to calculate
* @returns - Number of elapsed minutes
*/
export const getElapsedMinutes = (date1, date2) => Math.round((date1.getTime() - date2.getTime()) / oneMinute) * -1;
/**
* Calculates number of elapsed seconds between date1 and date2
*
* @param date1 - Starting date object to calculate
* @param date2 - Ending date object to calculate
* @returns - Number of elapsed seconds
*/
export const getElapsedSeconds = (date1, date2) => Math.round((date1.getTime() - date2.getTime()) / 1000 /* MsPerSec */) * -1;
/**
* Calculates number of elapsed milliseconds between date1 and date2
*
* @param date1 - Starting date object to calculate
* @param date2 - Ending date object to calculate
* @returns - Number of elapsed milliseconds
*/
export const getElapsedMs = (date1, date2) => Math.round(date1.getTime() - date2.getTime()) * -1;
/**
* Calculates elapsed time between current and previous
*
* @param start- Start date
* @param end - End date
* @param approx - Text to append to values from days and on, e.g *about* 1 day aga
* @returns Time difference in string form, e.g "3 seconds ago"
*/
export const getElapsedString = (start, end, approx = "about") => {
const daysPerMonth = 30;
const daysPerYear = 365;
const msPerMonth = oneDay * daysPerMonth;
const msPerYear = oneDay * daysPerYear;
const elapsed = getElapsedMs(start, end);
let val;
if (elapsed < oneMinute) {
val = Math.round(elapsed / 1000 /* MsPerSec */);
return `${val} second${val === 1 ? "" : "s"} ago`;
}
else if (elapsed < oneHour) {
val = Math.round(elapsed / oneMinute);
return `${val} minute${val === 1 ? "" : "s"} ago`;
}
else if (elapsed < oneDay) {
val = Math.round(elapsed / oneHour);
return `${val} hour${val === 1 ? "" : "s"} ago`;
}
else if (elapsed < msPerMonth) {
val = Math.round(elapsed / oneDay);
return `${approx} ${val} day${val === 1 ? "" : "s"} ago`;
}
else if (elapsed < msPerYear) {
val = Math.round(elapsed / msPerMonth);
return `${approx} ${val} month${val === 1 ? "" : "s"} ago`;
}
val = Math.round(elapsed / msPerYear);
return `${approx} ${val} year${val === 1 ? "" : "s"} ago`;
};
// The next 2 functions are too hard to test for
/* istanbul ignore next */
/**
* Convert a utc date to local
*
* @param date - Date to use. Note that the parameter will never be mutated.
* @returns A new date object with the time converted form UTC
*/
export const utcToLocal = (date) => {
const newDate = date.constructor(date.getTime());
newDate.setMinutes(date.getMinutes() - date.getTimezoneOffset());
return newDate;
};
/* istanbul ignore next */
/**
* Get the current UTC Time
*
* @returns UTC Time
*/
export const getUtcTime = () => {
const now = new Date();
return Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate(), now.getUTCHours(), now.getUTCMinutes(), now.getUTCSeconds(), now.getUTCMilliseconds());
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7R0FPRztBQUVILE9BQU8sRUFBUyxhQUFhLEVBQUUsZUFBZSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFDLE1BQU0sVUFBVSxDQUFBO0FBZ0IzRiw4QkFBOEI7QUFDOUI7O0dBRUc7QUFDSCxNQUFNLGFBQWEsR0FBUztJQUN4QixDQUFDLEVBQUUsTUFBTTtJQUNULENBQUMsRUFBRSxPQUFPO0lBQ1YsQ0FBQyxFQUFFLEtBQUs7Q0FDWCxDQUFBO0FBQ0QsNkJBQTZCO0FBRTdCOzs7Ozs7R0FNRztBQUNILE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRyxDQUFDLElBQVksRUFBRSxTQUFTLEdBQUcsR0FBRyxFQUFVLEVBQUU7SUFDOUQsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQTtJQUV2QyxNQUFNLGFBQWEsR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FDNUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FDL0MsQ0FBQTtJQUVELE9BQU8sYUFBYSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQTtBQUN4QyxDQUFDLENBQUE7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHLENBQUMsSUFBVSxFQUFFLFNBQXFCLE9BQU8sRUFBRSxTQUFTLEdBQUcsR0FBRyxFQUFVLEVBQUU7SUFDNUYsTUFBTSxLQUFLLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUE7SUFDOUMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFBO0lBQ3JDLDhCQUE4QjtJQUM5QixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUE7SUFDMUMsTUFBTSxNQUFNLEdBQUc7UUFDWCxDQUFDLEVBQUUsS0FBSztRQUNSLENBQUMsRUFBRSxHQUFHO1FBQ04sQ0FBQyxFQUFFLElBQUk7S0FDVixDQUFBO0lBQ0QsNkJBQTZCO0lBQzdCLE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFZLENBQUE7SUFFaEQsT0FBTyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUE7QUFDaEUsQ0FBQyxDQUFBO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRyxDQUN6QixJQUFZLEVBQ1osU0FBcUIsT0FBTyxFQUM1QixTQUFTLEdBQUcsTUFBTSxFQUNYLEVBQUU7SUFDVCxJQUFJLFVBQVUsR0FBRyxHQUFHLENBQUE7SUFFcEIsSUFBSSxTQUFTLEtBQUssTUFBTSxFQUFFO1FBQ3RCLEtBQUssTUFBTSxNQUFNLElBQUksSUFBSSxFQUFFO1lBQ3ZCLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFO2dCQUN2QixVQUFVLEdBQUcsTUFBTSxDQUFBO2dCQUNuQixNQUFLO2FBQ1I7U0FDSjtLQUNKO1NBQU07UUFDSCxVQUFVLEdBQUcsU0FBUyxDQUFBO0tBQ3pCO0lBRUQsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQTtJQUN4QyxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBWSxDQUFBO0lBQy9DLE1BQU0sTUFBTSxHQUE0QixFQUFFLENBQUE7SUFFMUMsS0FBSyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRTtRQUNwQyxNQUFNLEdBQUcsR0FBRyxhQUFhLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUE7UUFFNUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQTtLQUN6QztJQUVELE9BQU8sTUFBaUIsQ0FBQTtBQUM1QixDQUFDLENBQUE7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRyxDQUFDLFNBQXFDLEVBQVUsRUFBRSxDQUN4RSxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUE7QUFFNUI7Ozs7O0dBS0c7QUFDSCxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsQ0FBQyxTQUF1QyxFQUFVLEVBQUUsQ0FDNUUsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFBO0FBRTlCOzs7Ozs7R0FNRztBQUNILE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRyxDQUFDLEtBQVcsRUFBRSxLQUFXLEVBQVUsRUFBRSxDQUMvRCxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxHQUFHLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFBO0FBRWpFOzs7Ozs7R0FNRztBQUNILE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRyxDQUFDLEtBQVcsRUFBRSxLQUFXLEVBQVUsRUFBRSxDQUNoRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxHQUFHLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFBO0FBRWxFOzs7Ozs7R0FNRztBQUNILE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFHLENBQUMsS0FBVyxFQUFFLEtBQVcsRUFBVSxFQUFFLENBQ2xFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLEdBQUcsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUE7QUFFcEU7Ozs7OztHQU1HO0FBQ0gsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxLQUFXLEVBQUUsS0FBVyxFQUFVLEVBQUUsQ0FDbEUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsR0FBRyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsc0JBQWtCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQTtBQUUxRTs7Ozs7O0dBTUc7QUFDSCxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsQ0FBQyxLQUFXLEVBQUUsS0FBVyxFQUFVLEVBQUUsQ0FDN0QsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLEdBQUcsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUE7QUFFdEQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLENBQUMsS0FBVyxFQUFFLEdBQVMsRUFBRSxNQUFNLEdBQUcsT0FBTyxFQUFVLEVBQUU7SUFDakYsTUFBTSxZQUFZLEdBQUcsRUFBRSxDQUFBO0lBQ3ZCLE1BQU0sV0FBVyxHQUFHLEdBQUcsQ0FBQTtJQUN2QixNQUFNLFVBQVUsR0FBRyxNQUFNLEdBQUcsWUFBWSxDQUFBO0lBQ3hDLE1BQU0sU0FBUyxHQUFHLE1BQU0sR0FBRyxXQUFXLENBQUE7SUFDdEMsTUFBTSxPQUFPLEdBQUcsWUFBWSxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQTtJQUV4QyxJQUFJLEdBQUcsQ0FBQTtJQUVQLElBQUksT0FBTyxHQUFHLFNBQVMsRUFBRTtRQUNyQixHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLHNCQUFrQixDQUFDLENBQUE7UUFFM0MsT0FBTyxHQUFHLEdBQUcsVUFBVSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFBO0tBQ3BEO1NBQU0sSUFBSSxPQUFPLEdBQUcsT0FBTyxFQUFFO1FBQzFCLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxTQUFTLENBQUMsQ0FBQTtRQUVyQyxPQUFPLEdBQUcsR0FBRyxVQUFVLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUE7S0FDcEQ7U0FBTSxJQUFJLE9BQU8sR0FBRyxNQUFNLEVBQUU7UUFDekIsR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxDQUFBO1FBRW5DLE9BQU8sR0FBRyxHQUFHLFFBQVEsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQTtLQUNsRDtTQUFNLElBQUksT0FBTyxHQUFHLFVBQVUsRUFBRTtRQUM3QixHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDLENBQUE7UUFFbEMsT0FBTyxHQUFHLE1BQU0sSUFBSSxHQUFHLE9BQU8sR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQTtLQUMzRDtTQUFNLElBQUksT0FBTyxHQUFHLFNBQVMsRUFBRTtRQUM1QixHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsVUFBVSxDQUFDLENBQUE7UUFFdEMsT0FBTyxHQUFHLE1BQU0sSUFBSSxHQUFHLFNBQVMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQTtLQUM3RDtJQUVELEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxTQUFTLENBQUMsQ0FBQTtJQUVyQyxPQUFPLEdBQUcsTUFBTSxJQUFJLEdBQUcsUUFBUSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFBO0FBQzdELENBQUMsQ0FBQTtBQUVELGdEQUFnRDtBQUNoRCwwQkFBMEI7QUFDMUI7Ozs7O0dBS0c7QUFDSCxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQUcsQ0FBaUIsSUFBTyxFQUFLLEVBQUU7SUFDckQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQU0sQ0FBQTtJQUVyRCxPQUFPLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsR0FBRyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxDQUFBO0lBRWhFLE9BQU8sT0FBTyxDQUFBO0FBQ2xCLENBQUMsQ0FBQTtBQUVELDBCQUEwQjtBQUMxQjs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHLEdBQVcsRUFBRTtJQUNuQyxNQUFNLEdBQUcsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFBO0lBRXRCLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FDWCxHQUFHLENBQUMsY0FBYyxFQUFFLEVBQ3BCLEdBQUcsQ0FBQyxXQUFXLEVBQUUsRUFDakIsR0FBRyxDQUFDLFVBQVUsRUFBRSxFQUNoQixHQUFHLENBQUMsV0FBVyxFQUFFLEVBQ2pCLEdBQUcsQ0FBQyxhQUFhLEVBQUUsRUFDbkIsR0FBRyxDQUFDLGFBQWEsRUFBRSxFQUNuQixHQUFHLENBQUMsa0JBQWtCLEVBQUUsQ0FDM0IsQ0FBQTtBQUNMLENBQUMsQ0FBQSJ9