import { DateTime } from 'luxon'; const DEFAULT_TIMEZONE = 'Etc/UTC'; const currentBrowserTimezone = (): string => { return Intl.DateTimeFormat().resolvedOptions().timeZone; }; const now = (timezone: string = DEFAULT_TIMEZONE): number => { return DateTime.fromMillis(DateTime.now().toMillis(), { zone: timezone }).toMillis(); }; const fromNow = (millis: number | string, timezone = DEFAULT_TIMEZONE): number => { if (typeof millis === 'string') millis = Number(millis); return now(timezone) + millis; }; const date = (millis: number | string, timezone = DEFAULT_TIMEZONE): DateTime => { if (typeof millis === 'string') millis = Number(millis); return DateTime.fromMillis(millis, { zone: timezone }); }; /** * https://moment.github.io/luxon/#/formatting?id=table-of-tokens */ const format = (millis: number | string, format: string = 'DD', timezone: string = DEFAULT_TIMEZONE): string => { if (typeof millis === 'string') millis = Number(millis); return date(millis, timezone).toFormat(format); }; const ago = (millis: number | string, timezone: string = DEFAULT_TIMEZONE): string => { const now = DateTime.fromMillis(DateTime.now().toMillis(), { zone: timezone }); const inputDate = date(millis); const diff = now.diff(inputDate, ['years', 'months', 'days', 'hours', 'minutes', 'seconds']); const diffRounded = diff.toObject(); if (diffRounded.years) { return `${Math.floor(diffRounded.years)} year${diffRounded.years > 1 ? 's' : ''} ago`; } if (diffRounded.months) { return `${Math.floor(diffRounded.months)} month${diffRounded.months > 1 ? 's' : ''} ago`; } if (diffRounded.days) { return `${Math.floor(diffRounded.days)} day${diffRounded.days > 1 ? 's' : ''} ago`; } if (diffRounded.hours) { return `${Math.floor(diffRounded.hours)} hour${diffRounded.hours > 1 ? 's' : ''} ago`; } if (diffRounded.minutes) { return `${Math.floor(diffRounded.minutes)} minute${diffRounded.minutes > 1 ? 's' : ''} ago`; } return `${Math.floor(diffRounded.seconds || 0)} second${diffRounded.seconds || 0 > 1 ? 's' : ''} ago`; }; const TimeUtil = { currentBrowserTimezone, now, fromNow, date, format, ago, }; export default TimeUtil;