@veryoriginalnickname

Почему числительные странно склоняются?

С сервера поступают данные, и среди этих данных есть дата последнего изменения записи, в виде "2021-07-16T17:56:29.434+03:00". Эту дату преобразовываю в Date, и потом склоняю. Типа "редактировано 3 часа назад". Проблема в том, что склонение работает очень странно. Если обновлять страницу, то одно и тоже число склоняется по-разному. То "3 часа", то "3 час", то "3 часов". Почему?
Куски кода:
<div class="article-item article-updated-at">ред. {{ convertDateWrap(article.updated_at) }}</div>

convertDateWrap(date){
      return ElvenTools.convertDate(date)
    }

const hoursTitles = ['час', 'часа', 'часов']
const minTitles = ['минуту', 'минуты', 'минут']
const secTitles = ['секунду', 'секунды', 'секунд']

class ElvenTools{
    public static convertDate(date){
        date = new Date(date)
        const currentDate = new Date()
        const isYesterday = currentDate.getFullYear() === date.getFullYear() && currentDate.getMonth() === date.getMonth() && currentDate.getDay() > date.getDay() && currentDate.getDay() - date.getDay() === 1
        const isToday = currentDate.getFullYear() === date.getFullYear() && currentDate.getMonth() === date.getMonth() && currentDate.getDay() === date.getDay()
        if(isYesterday){
            date = `вчера в ${date.getHours()}:${date.getMinutes()}`
        } else if(isToday){
            const secondsAgo = Math.round((currentDate.getTime() - date.getTime()) / 1000)
            const minutesAgo = Math.round(secondsAgo / 60)
            const hoursAgo = Math.round(minutesAgo / 60)
            if(secondsAgo < 60){
                // 1min-
                date = `${secondsAgo} ${this.declensionOfNumbers(secondsAgo, secTitles)} назад`
            } else if(minutesAgo < 60){
                // 1h-
                date = `${minutesAgo} ${this.declensionOfNumbers(secondsAgo, minTitles)} назад`
            } else if(hoursAgo === 1){
                // 2h-
                date = `час назад`
            } else if(hoursAgo < 8){
                // 8h-
                date = `${hoursAgo} ${this.declensionOfNumbers(secondsAgo, hoursTitles)} назад`
            } else if(hoursAgo < 24){
                // 24h-
                date = `в ${date.getHours()}:${date.getMinutes()}`
            }
        } else{
            date = `${date.getDay()}.${date.getMonth()}.${date.getFullYear()} в ${date.getHours()}:${date.getMinutes()}`
        }
        return date
    }

    public static declensionOfNumbers(number, titles){
        // https://gist.github.com/realmyst/1262561#gistcomment-3443551
        number = Math.abs(number);
        if (Number.isInteger(number)) {
            const cases = [2, 0, 1, 1, 1, 2];
            return titles[ (number%100>4 && number%100<20)? 2 : cases[(number%10<5)?number%10:5] ];
        }
        return titles[1]
    }
}

export default ElvenTools
  • Вопрос задан
  • 93 просмотра
Решения вопроса 1
@galaxy
ничего не замечаете?

// 8h-
date = `${hoursAgo} ${this.declensionOfNumbers(secondsAgo, hoursTitles)} назад`
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы