@ask-imon/time_diff_calc
Version:
A package that will help user calculate difference between 2 timestamps and get the output in multiple format, based on requirements.
120 lines (97 loc) • 5.62 kB
JavaScript
// A pseudo-enum for format types
const FormatTypes = {
MILLISECOND: 'ms',
SECOND: 'sec',
MINUTE: 'min',
HOUR: 'hr',
DAY: 'day',
WEEK: 'wk',
MONTH: 'mon',
YEAR: 'yr',
DHMS: 'dhms',
DETAIL: 'detail'
};
/**
* Calculate the difference between two timestamps and return it in various formats.
*
* @param {string} timestamp1 - First timestamp.
* @param {string} timestamp2 - Second timestamp.
* @param {string} format - The desired output format. Options are 'ms' (milliseconds), 'sec' (seconds), 'min' (minutes), 'hr' (hours),
* 'day' (days), 'wk' (weeks), 'mon' (months), 'yr' (years), 'dhms' (days, hours, minutes, seconds),
* 'detail' (detailed breakdown including all units).
* @returns {number|string} - Difference between the timestamps in the desired format.
* @throws {Error} - Throws an error if an unsupported format is provided.
*/
function timeDiffCalc(timestamp1, timestamp2, format = FormatTypes.SECOND) {
// Convert the given timestamps to Date objects
const date1 = new Date(timestamp1);
const date2 = new Date(timestamp2);
// Calculate the absolute difference in milliseconds between the two timestamps
const differenceInMilliseconds = Math.abs(date1 - date2);
switch (format) {
case FormatTypes.MILLISECOND:
// Return difference in milliseconds
return differenceInMilliseconds;
case FormatTypes.SECOND:
// Return difference in seconds
return differenceInMilliseconds / 1000;
case FormatTypes.MINUTE:
// Return difference in minutes
return Math.floor(differenceInMilliseconds / 1000 / 60);
case FormatTypes.HOUR:
// Return difference in hours
return Math.floor(differenceInMilliseconds / 1000 / 60 / 60);
case FormatTypes.DAY:
// Return difference in days
return Math.floor(differenceInMilliseconds / 1000 / 60 / 60 / 24);
case FormatTypes.WEEK:
// Return difference in weeks
return Math.floor(differenceInMilliseconds / 1000 / 60 / 60 / 24 / 7);
case FormatTypes.MONTH:
// Return an estimated difference in months (considering an average month length)
return Math.floor(differenceInMilliseconds / 1000 / 60 / 60 / 24 / 30);
case FormatTypes.YEAR:
// Return an estimated difference in years
return Math.floor(differenceInMilliseconds / 1000 / 60 / 60 / 24 / 365);
case FormatTypes.DHMS:
// Existing 'dhms' format code...
// Calculating days, hours, minutes, and seconds
const seconds = Math.floor(differenceInMilliseconds / 1000);
const minutes = Math.floor(seconds / 60);
const hours = Math.floor(minutes / 60);
const days = Math.floor(hours / 24);
let formattedDifference = '';
if (days > 0) formattedDifference += `${days} Day${days > 1 ? 's' : ''}, `;
if (hours % 24 > 0) formattedDifference += `${hours % 24} Hour${hours % 24 > 1 ? 's' : ''}, `;
if (minutes % 60 > 0) formattedDifference += `${minutes % 60} Minute${minutes % 60 > 1 ? 's' : ''}, `;
if (seconds % 60 > 0) formattedDifference += `${seconds % 60} Second${seconds % 60 > 1 ? 's' : ''}`;
return formattedDifference.trim();
case FormatTypes.DETAIL:
// Detailed breakdown calculation
const totalSeconds = Math.floor(differenceInMilliseconds / 1000);
const totalMinutes = Math.floor(totalSeconds / 60);
const totalHours = Math.floor(totalMinutes / 60);
const totalDays = Math.floor(totalHours / 24);
const totalWeeks = Math.floor(totalDays / 7);
// Approximate the number of months and years
const totalMonths = Math.floor(totalDays / 30);
const totalYears = Math.floor(totalDays / 365);
// Calculate remaining time after subtracting each larger unit
const remainingDays = totalDays % 365 % 30; // Days remaining after accounting for years and months
const remainingHours = totalHours % 24; // Hours remaining after accounting for whole days
const remainingMinutes = totalMinutes % 60; // Minutes remaining after accounting for whole hours
const remainingSeconds = totalSeconds % 60; // Seconds remaining after accounting for whole minutes
let detailedBreakdown = '';
// Add each time unit to the breakdown if it's greater than zero
if (totalYears > 0) detailedBreakdown += `${totalYears} Year${totalYears > 1 ? 's' : ''}, `;
if (totalMonths % 12 > 0) detailedBreakdown += `${totalMonths % 12} Month${totalMonths % 12 > 1 ? 's' : ''}, `;
if (remainingDays > 0) detailedBreakdown += `${remainingDays} Day${remainingDays > 1 ? 's' : ''}, `;
if (remainingHours > 0) detailedBreakdown += `${remainingHours} Hour${remainingHours > 1 ? 's' : ''}, `;
if (remainingMinutes > 0) detailedBreakdown += `${remainingMinutes} Minute${remainingMinutes > 1 ? 's' : ''}, `;
if (remainingSeconds > 0) detailedBreakdown += `${remainingSeconds} Second${remainingSeconds > 1 ? 's' : ''}`;
return detailedBreakdown.trim();
default:
throw new Error('Invalid format. Supported formats: "sec", "min", "hr", "day", "wk", "mon", "yr", "dhms", "detail".');
}
}
module.exports = { timeDiffCalc, FormatTypes };