/
memoryspeak
/
MemorySpeakWebClient
Обзор
Документация
Войти
/
memoryspeak
/
MemorySpeakWebClient
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
static/js/TimeFormatter.js
146 строк
6 KB
memoryspeak
initial commit: project structure
20 ноя 2025, 21:54
20 ноя 2025, 21:54
9ddd280
Код
Авторство
О чём код?
class TimeFormatter { static translator = { 'en': { inFuture: 'in future', justNow: 'just now', year: 'year', month: 'month', day: 'day', hour: 'hour', min: 'min', sec: 'sec', ago: 'ago', minute: 'minute', hours: 'hour', days: 'day', months: 'month', years: 'year', postfix: 's' }, 'ru': { inFuture: 'в будущем', justNow: 'прямо сейчас', year: 'год', month: 'месяц', day: 'день', hour: 'час', min: 'мин', sec: 'сек', ago: 'назад', minute: 'минут', hours: 'часов', days: 'дней', months: 'месяцев', hours: 'лет', postfix: '' } }; static formats = { FORMAT_SOURCE: 'source', // YYYY-DD-MM HH:MM:SS FORMAT_SHORT: 'short', // 1 min, 2 hours, 3 days FORMAT_FULL: 'full', // 1 minute ago, 2 hours ago, 3 days ago FORMAT_PRECISE: 'precise', // 1 min 30 sec, 2 hours 15 min FORMAT_FULL_DATE: 'full_date' // Jun 27, 2025 }; // createdAt, currentTime format - FORMAT_SOURCE = 'source'; // YYYY-DD-MM HH:MM:SS static getFormatTime(createdAt, currentTime, format = TimeFormatter.FORMAT_SHORT) { if (format === this.formats.FORMAT_SOURCE) return createdAt; const createdDate = new Date(createdAt); const currentDate = new Date(currentTime); const seconds = Math.floor((currentDate - createdDate) / 1000); if (seconds < 0) { return this.translator[SettingsPage.language].inFuture; }; // Less than a minute if (seconds < 60) { switch (format) { case this.formats.FORMAT_FULL: return 'just now'; case this.formats.FORMAT_PRECISE: return `${seconds} sec`; default: return this.translator[SettingsPage.language].justNow; }; }; // Minutes const minutes = Math.floor(seconds / 60); if (minutes < 60) { switch (format) { case this.formats.FORMAT_FULL: return `${minutes} ${this.translator[SettingsPage.language].minute}${minutes === 1 ? '' : this.translator[SettingsPage.language].postfix} ${this.translator[SettingsPage.language].ago}`; case this.formats.FORMAT_PRECISE: { const remainingSeconds = seconds % 60; return `${minutes} ${this.translator[SettingsPage.language].min}${remainingSeconds > 0 ? ` ${remainingSeconds} ${this.translator[SettingsPage.language].sec}` : ''}`; }; default: return `${minutes} ${this.translator[SettingsPage.language].min}`; }; }; // Hours const hours = Math.floor(minutes / 60); if (hours < 24) { switch (format) { case this.formats.FORMAT_FULL: return `${hours} ${this.translator[SettingsPage.language].hours}${hours === 1 ? '' : this.translator[SettingsPage.language].postfix} ${this.translator[SettingsPage.language].ago}`; case this.formats.FORMAT_PRECISE: { const remainingMinutes = minutes % 60; return `${hours} ${this.translator[SettingsPage.language].hour}${remainingMinutes > 0 ? ` ${remainingMinutes} ${this.translator[SettingsPage.language].min}` : ''}`; }; default: return `${hours} ${this.translator[SettingsPage.language].hours}${hours === 1 ? '' : this.translator[SettingsPage.language].postfix}`; }; }; // Days const days = Math.floor(hours / 24); if (days < 30) { switch (format) { case this.formats.FORMAT_FULL: return `${days} ${this.translator[SettingsPage.language].days}${days === 1 ? '' : this.translator[SettingsPage.language].postfix} ${this.translator[SettingsPage.language].ago}`; case this.formats.FORMAT_PRECISE: { const remainingHours = hours % 24; return `${days} ${this.translator[SettingsPage.language].day}${remainingHours > 0 ? ` ${remainingHours} ${this.translator[SettingsPage.language].hours}${remainingHours === 1 ? '' : this.translator[SettingsPage.language].postfix}` : ''}`; }; default: return `${days} ${this.translator[SettingsPage.language].days}${days === 1 ? '' : this.translator[SettingsPage.language].postfix}`; }; }; // Months (approximate) const months = Math.floor(days / 30); if (months < 12) { switch (format) { case this.formats.FORMAT_FULL: return `${months} ${this.translator[SettingsPage.language].months}${months === 1 ? '' : this.translator[SettingsPage.language].postfix} ${this.translator[SettingsPage.language].ago}`; case this.formats.FORMAT_PRECISE: { const remainingDays = days % 30; return `${months} ${this.translator[SettingsPage.language].month}${remainingDays > 0 ? ` ${remainingDays} ${this.translator[SettingsPage.language].days}${remainingDays === 1 ? '' : this.translator[SettingsPage.language].postfix}` : ''}`; }; default: return `${months} ${this.translator[SettingsPage.language].months}${months === 1 ? '' : this.translator[SettingsPage.language].postfix}`; }; }; // Years const years = Math.floor(months / 12); switch (format) { case this.formats.FORMAT_FULL: return `${years} ${this.translator[SettingsPage.language].years}${years === 1 ? '' : this.translator[SettingsPage.language].postfix} ${this.translator[SettingsPage.language].ago}`; case this.formats.FORMAT_PRECISE: { const remainingMonths = months % 12; return `${years} ${this.translator[SettingsPage.language].year}${remainingMonths > 0 ? ` ${remainingMonths} ${this.translator[SettingsPage.language].months}${remainingMonths === 1 ? '' : this.translator[SettingsPage.language].postfix}` : ''}`; }; case this.formats.FORMAT_FULL_DATE: { return createdDate.toLocaleDateString('en-US', { year: 'numeric', month: 'short', day: 'numeric' }); }; default: return `${years} ${this.translator[SettingsPage.language].years}${years === 1 ? '' : this.translator[SettingsPage.language].postfix}`; }; }; // Helper method to cycle through formats static getNextFormat(currentFormat) { const formatValues = Object.values(this.formats); const currentIndex = formatValues.indexOf(currentFormat); return formatValues[(currentIndex + 1) % formatValues.length]; }; };