This repository has been archived on 2024-10-29. You can view files and clone it, but cannot push or open issues or pull requests.
scoresaber-reloadedv3/projects/common/src/utils/time-utils.ts
Liam ae4e6912e5
All checks were successful
Deploy Backend / deploy (push) Successful in 2m52s
Deploy Website / deploy (push) Successful in 4m36s
add joined date stat
2024-10-17 02:21:59 +01:00

137 lines
3.3 KiB
TypeScript

/**
* This function returns the time ago of the input date
*
* @param input Date | number (timestamp)
* @returns the format of the time ago
*/
export function timeAgo(input: Date) {
const inputDate = new Date(input).getTime(); // Convert input to a Date object if it's not already
const now = new Date().getTime();
const deltaSeconds = Math.floor((now - inputDate) / 1000); // Get time difference in seconds
if (deltaSeconds <= 10) {
return "just now";
}
const timeUnits = [
{ unit: "y", seconds: 60 * 60 * 24 * 365 }, // years
{ unit: "mo", seconds: 60 * 60 * 24 * 30 }, // months
{ unit: "d", seconds: 60 * 60 * 24 }, // days
{ unit: "h", seconds: 60 * 60 }, // hours
{ unit: "m", seconds: 60 }, // minutes
{ unit: "s", seconds: 1 }, // seconds
];
const result = [];
let remainingSeconds = deltaSeconds;
for (const { unit, seconds } of timeUnits) {
const count = Math.floor(remainingSeconds / seconds);
if (count > 0) {
result.push(`${count}${unit}`);
remainingSeconds -= count * seconds;
}
// Stop after two units have been added
if (result.length === 2) break;
}
// Return formatted result with at most two units
return result.join(", ") + " ago";
}
/**
* Formats the date in the format "DD MMMM YYYY"
*
* @param date the date
*/
export function formatDateMinimal(date: Date) {
return date.toLocaleString("en-US", {
timeZone: "Europe/London",
day: "numeric",
month: "short",
year: "numeric",
});
}
/**
* Formats the date
*
* @param date the date to format
* @param format the format to return
* @returns the formatted date
*/
export function formatDate(date: Date, format: "MMMM YYYY" | "DD MMMM YYYY" | "DD MMMM YYYY HH:mm" = "MMMM YYYY") {
switch (format) {
case "MMMM YYYY": {
return date.toLocaleString("en-US", {
timeZone: "Europe/London",
month: "long",
year: "numeric",
});
}
case "DD MMMM YYYY": {
return date.toLocaleString("en-US", {
timeZone: "Europe/London",
day: "numeric",
month: "long",
year: "numeric",
});
}
case "DD MMMM YYYY HH:mm": {
return date.toLocaleString("en-US", {
timeZone: "Europe/London",
day: "numeric",
month: "long",
year: "numeric",
hour: "numeric",
minute: "numeric",
});
}
default: {
return formatDateMinimal(date);
}
}
}
/**
* Gets the midnight aligned date
*
* @param date the date
*/
export function getMidnightAlignedDate(date: Date) {
return new Date(Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate()));
}
/**
* Gets the date X days ago
*
* @param days the number of days to go back
* @returns {Date} A Date object representing the date X days ago
*/
export function getDaysAgoDate(days: number): Date {
const date = new Date();
date.setDate(date.getDate() - days);
return date;
}
/**
* Gets the amount of days ago a date was
*
* @param date the date
* @returns the amount of days
*/
export function getDaysAgo(date: Date): number {
const now = new Date();
const diffTime = Math.abs(now.getTime() - date.getTime());
return Math.ceil(diffTime / (1000 * 60 * 60 * 24)) - 1;
}
/**
* Parses a date from a string
*
* @param date the date
*/
export function parseDate(date: string): Date {
return new Date(date);
}