Хелперы для работы с датами + polyfill для свежего API 2025 года

This commit is contained in:
Иван Кузьменко 2025-11-16 06:24:33 +03:00
parent b0bd04b8d6
commit a6bccea822
6 changed files with 134 additions and 17 deletions

42
src/lib/util/Dates.ts Normal file
View file

@ -0,0 +1,42 @@
import { shouldPolyfill } from '@formatjs/intl-durationformat/should-polyfill'
if (shouldPolyfill()) {
import('@formatjs/intl-durationformat/polyfill-force');
}
export const dateFormatShort = new Intl.DateTimeFormat(undefined, {
month: 'short',
day: 'numeric',
year: 'numeric'
});
export const dateFormatLong = new Intl.DateTimeFormat(undefined, {
month: 'short',
day: 'numeric',
year: 'numeric',
hour: '2-digit',
minute: '2-digit'
});
export const dateDurationLong = new Intl.DurationFormat(undefined, {
style: "long"
});
export const dateDurationLongBackup = new Intl.DurationFormat(undefined, {
style: "long",
seconds: "long"
});
export const durationHumanReadable = (a: Date, b: Date) => durationHumanReadableMillis(b.valueOf() - a.valueOf());
export function durationHumanReadableMillis(dur: number): string {
dur = Math.max(dur, 0);
const seconds = dur / 1000;
const minutes = dur / (1000 * 60);
const hours = dur / (1000 * 60 * 60);
const days = dur / (1000 * 60 * 60 * 24);
const formatObject = { days: Math.floor(days), hours: Math.floor(hours) % 24, minutes: Math.floor(minutes) % 60, seconds: Math.floor(seconds) % 60 };
const result = dateDurationLong.format(formatObject);
// Если на выходе получаем пустую строку, то хоть выведем 0 секунд
return result === '' ? dateDurationLongBackup.format(formatObject) : result;
}