Хелперы для работы с датами + polyfill для свежего API 2025 года
This commit is contained in:
parent
b0bd04b8d6
commit
a6bccea822
6 changed files with 134 additions and 17 deletions
42
src/lib/util/Dates.ts
Normal file
42
src/lib/util/Dates.ts
Normal 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;
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue