@luke-zhang-04/dateplus
Version:
A simple program to assist with date manipulation
567 lines (504 loc) • 15.3 kB
JavaScript
/**
* DatePlus
* A simple program to assist with date manipulation
* @copyright Copyright (C) 2020 - 2021 Luke Zhang
* @author Luke Zhang luke-zhang-04.github.io
* @license MIT
* @version 4.0.0-beta2
*/
/**
* Converts milliseconds to seconds with remainders
*
* @param ms - Milliseconds to convert
* @returns Object with seconds and milliseconds
*/
const msToSecs = ms => ({
ms: ms % 1000,
seconds: (ms - ms % 1000) / 1000
});
const msToSeconds = msToSecs;
/**
* Converts milliseconds to minutes with remainders
*
* @param ms - Milliseconds to convert
* @returns Object with minutes, seconds, and milliseconds
*/
const msToMins = ms => {
const milliseconds = ms % 1000 % 1000;
const seconds = (ms - ms % 1000) / 1000 % 60;
const minutes = (ms - seconds * 1000 - milliseconds) / (1000 * 60);
return {
ms: milliseconds,
seconds,
minutes
};
};
const msToMinutes = msToMins;
/**
* Converts milliseconds to hours with remainders
*
* @param ms - Milliseconds to convert
* @returns Object with hours, minutes, seconds, and milliseconds
*/
const msToHrs = ms => {
const milliseconds = ms % 1000 % 1000;
const seconds = (ms - ms % 1000) / 1000 % 60;
const minutes = (ms - seconds * 1000 - milliseconds) / (1000 * 60) % 60;
const hours = (ms - minutes * 1000 * 60 - seconds * 1000 - milliseconds) / (1000 * 60 * 60);
return {
ms: milliseconds,
seconds,
minutes,
hours
};
};
const msToHours = msToHrs;
/**
* Converts milliseconds to days with remainders
*
* @param ms - Milliseconds to convert
* @returns Object with days, hours, minutes, seconds, and milliseconds
*/
const msToDays = ms => {
const milliseconds = ms % 1000 % 1000;
const seconds = (ms - ms % 1000) / 1000 % 60;
const minutes = (ms - seconds * 1000 - milliseconds) / (1000 * 60) % 60;
const hours = (ms - minutes * 1000 * 60 - seconds * 1000 - milliseconds) / (1000 * 60 * 60) % 24;
const days = (ms - hours * 1000 * 60 * 60 - minutes * 1000 * 60 - seconds * 1000 - milliseconds) / (1000 * 60 * 60 * 24);
return {
ms: milliseconds,
seconds,
minutes,
hours,
days
};
};
/**
* Converts seconds to milliseconds
*
* @param secs - Seconds to convert
* @returns Converted milliseconds
*/
const secsToMs = secs => secs * 1000;
const secondsToMs = secsToMs;
/**
* Converts seconds to minutes with remainders
*
* @param secs - Seconds to convert
* @returns Converted minutes
*/
const secsToMins = secs => msToMins(secsToMs(secs));
const secondsToMinutes = secsToMins;
/**
* Converts seconds to hours with remainders
*
* @param secs - Seconds to convert
* @returns Converted hours
*/
const secsToHrs = secs => msToHrs(secsToMs(secs));
const secondsToHours = secsToHrs;
/**
* Converts seconds to days with remainders
*
* @param secs - Seconds to convert
* @returns Converted days
*/
const secsToDays = secs => msToDays(secsToMs(secs));
const secondsToDays = secsToDays;
/**
* Converts hours to milliseconds
*
* @param mins - Minutes to convert
* @returns Converted milliseconds
*/
const minsToMs = mins => mins * 60 * 1000;
const minutesToMs = secsToDays;
/**
* Converts hours to seconds
*
* @param mins - Minutes to convert
* @returns Converted seconds
*/
const minsToSecs = mins => mins * 60;
const minutesToSeconds = minsToSecs;
/**
* Converts minutes to hours with remainders
*
* @param mins - Minutes to convert
* @returns Converted hours
*/
const minsToHrs = mins => msToHrs(minsToMs(mins));
const minutesToHours = minsToHrs;
/**
* Converts minutes to days with remainders
*
* @param mins - Minutes to convert
* @returns Converted days
*/
const minsToDays = mins => msToDays(minsToMs(mins));
const minutesToDays = minsToDays;
/**
* Converts hours to milliseconds
*
* @param hours - Hours to convert
* @returns Converted milliseconds
*/
const hrsToMs = hours => hours * 60 * 60 * 1000;
const hoursToMs = hrsToMs;
/**
* Converts hours to seconds
*
* @param hours - Hours to convert
* @returns Converted seconds
*/
const hrsToSecs = hours => hours * 60 * 60;
const hoursToSeconds = hrsToSecs;
/**
* Converts hours to minutes
*
* @param hours - Hours to convert
* @returns Converted minutes
*/
const hrsToMins = hours => hours * 60;
const hoursToMinutes = hrsToMins;
/**
* Converts hours to days with remainders
*
* @param hrs - Hours to convert
* @returns Converted days
*/
const hrsToDays = hrs => msToDays(hrsToMs(hrs));
const hoursToDays = hrsToDays;
/**
* Converts days to milliseconds
*
* @param days - Days to convert
* @returns Converted milliseconds
*/
const daysToMs = days => days * 24 * 60 * 60 * 1000;
/**
* Converts days to seconds
*
* @param days - Days to convert
* @returns Converted seconds
*/
const daysToSecs = days => days * 24 * 60 * 60;
const daysToSeconds = daysToSecs;
/**
* Converts days to minutes
*
* @param days - Days to convert
* @returns Converted minutes
*/
const daysToMins = days => days * 24 * 60;
const daysToMinutes = daysToMins;
/**
* Converts days to hours
*
* @param days - Days to convert
* @returns Converted hours
*/
const daysToHrs = days => days * 24;
const daysToHours = daysToHrs;
const values = {
hrsPerDay: 24,
minsPerHr: 60,
secsPerMin: 60,
msPerSec: 1000
};
const daysReference = {
0: "Sunday",
1: "Monday",
2: "Tuesday",
3: "Wednesday",
4: "Thursday",
5: "Friday",
6: "Saturday"
};
const monthsReference = {
0: "January",
1: "Feburary",
2: "March",
3: "April",
4: "May",
5: "June",
6: "July",
7: "August",
8: "September",
9: "October",
10: "November",
11: "December"
};
const oneMinute = 60 * 1000;
const oneHour = 60 * oneMinute;
const oneDay = 24 * oneHour;
const keysReference = {
y: "year",
m: "month",
d: "day"
};
/**
* 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
*/
const addZeros = (date, seperator = "/") => {
const splitDate = date.split(seperator);
const newDateValues = splitDate.map(section => section.length < 2 ? "0".concat(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
*/
const formatDate = (date, format = "y:m:d", seperator = "/") => {
const month = (date.getMonth() + 1).toString();
const day = date.getDate().toString();
const year = date.getFullYear().toString();
const values = {
m: month,
d: day,
y: year
};
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
*/
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
*/
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
*/
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
*/
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
*/
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
*/
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
*/
const getElapsedSeconds = (date1, date2) => Math.round((date1.getTime() - date2.getTime()) / 1000) * -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
*/
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"
*/
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);
return "".concat(val, " second").concat(val === 1 ? "" : "s", " ago");
} else if (elapsed < oneHour) {
val = Math.round(elapsed / oneMinute);
return "".concat(val, " minute").concat(val === 1 ? "" : "s", " ago");
} else if (elapsed < oneDay) {
val = Math.round(elapsed / oneHour);
return "".concat(val, " hour").concat(val === 1 ? "" : "s", " ago");
} else if (elapsed < msPerMonth) {
val = Math.round(elapsed / oneDay);
return "".concat(approx, " ").concat(val, " day").concat(val === 1 ? "" : "s", " ago");
} else if (elapsed < msPerYear) {
val = Math.round(elapsed / msPerMonth);
return "".concat(approx, " ").concat(val, " month").concat(val === 1 ? "" : "s", " ago");
}
val = Math.round(elapsed / msPerYear);
return "".concat(approx, " ").concat(val, " year").concat(val === 1 ? "" : "s", " ago");
};
/**
* 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
*/
const utcToLocal = date => {
const newDate = date.constructor(date.getTime());
newDate.setMinutes(date.getMinutes() - date.getTimezoneOffset());
return newDate;
};
/**
* Get the current UTC Time
*
* @returns UTC Time
*/
const getUtcTime = () => {
const now = new Date();
return Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate(), now.getUTCHours(), now.getUTCMinutes(), now.getUTCSeconds(), now.getUTCMilliseconds());
};
class DatePlus extends Date {
/**
* 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
*/
addZeros(seperator = "/") {
return addZeros(this.formatDate(), seperator);
}
/**
* Format instantiated into a string in the form YYYY{seperator}MM{seperator}DD
*
* @param seperator - Char to seperate date with
* @param format - Format of string date
* @returns Formatted date
*/
formatDate(format = "y:m:d", seperator = "/") {
return formatDate(this, format, seperator);
}
/**
* Gets instantiated day of week in word form (e.g 0 => "Sunday")
*
* @returns Stringed day of week
*/
getWordDay() {
return daysReference[this.getDay()];
}
/**
* Gets instantiated month in word form (e.g 0 => "January")
*
* @returns Stringed worded month
*/
getWordMonth() {
return monthsReference[this.getMonth()];
}
/**
* Calculates number of elapsed days between instantiated date and dae
*
* @param date - Ending date object to calculate
* @returns - Number of elapsed days
*/
getElapsedDays(date) {
return getElapsedDays(this, date);
}
/**
* Calculates number of elapsed hours between date1 and date2
*
* @param date - Ending date object to calculate
* @returns - Number of elapsed hours
*/
getElapsedHours(date) {
return getElapsedHours(this, date);
}
/**
* Calculates number of elapsed minutes between date1 and date2
*
* @param date - Ending date object to calculate
* @returns - Number of elapsed minutes
*/
getElapsedMinutes(date) {
return getElapsedMinutes(this, date);
}
/**
* Calculates number of elapsed seconds between date1 and date2
*
* @param date - Ending date object to calculate
* @returns - Number of elapsed seconds
*/
getElapsedSeconds(date) {
return getElapsedSeconds(this, date);
}
/**
* Calculates number of elapsed milliseconds between date1 and date2
*
* @param date - Ending date object to calculate
* @returns - Number of elapsed milliseconds
*/
getElapsedMs(date) {
return getElapsedMs(this, date);
}
/**
* Calculates elapsed time between current and previous
*
* @param date - 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"
*/
getElapsedString(date, approx = "about") {
return getElapsedString(this, date, approx);
}
}
export default DatePlus;
export { DatePlus, addZeros, daysReference, daysToHours, daysToHrs, daysToMins, daysToMinutes, daysToMs, daysToSeconds, daysToSecs, formatDate, getDateValues, getElapsedDays, getElapsedHours, getElapsedMinutes, getElapsedMs, getElapsedSeconds, getElapsedString, getUtcTime, getWordDay, getWordMonth, hoursToDays, hoursToMinutes, hoursToMs, hoursToSeconds, hrsToDays, hrsToMins, hrsToMs, hrsToSecs, minsToDays, minsToHrs, minsToMs, minsToSecs, minutesToDays, minutesToHours, minutesToMs, minutesToSeconds, monthsReference, msToDays, msToHours, msToHrs, msToMins, msToMinutes, msToSeconds, msToSecs, oneDay, oneHour, oneMinute, secondsToDays, secondsToHours, secondsToMinutes, secondsToMs, secsToDays, secsToHrs, secsToMins, secsToMs, utcToLocal, values };
//# sourceMappingURL=dateplus.js.map