как я могу улучшить метод, который возвращает созданную разницу во времени, например (30s, 5m, 3h, 1y a go) в> = ES6 - PullRequest
0 голосов
/ 19 июня 2020

вот мой код

то, что я пытаюсь достичь, это время, подобное youtube / fb / instagram, показать разницу во времени публикации

например: 30 секунд назад 5 минут назад 15 часов назад 6 дней назад 1н назад 5y a go

код работает нормально, но является подробным, и мне интересно, может ли какой-нибудь js "гуру" улучшить это, используя последние функции ecmascript

 const timeAgo = () => {
    const date1 = dayjs(Date.now())
    const now = base.createdOn
    const diffInSeconds = date1.diff(now, 'second', false)

    let diff = date1.diff(now, 'second', false) + 's'

    if (diffInSeconds > 60 * 60 * 24 * 7 * 30 * 12) {
      return date1.diff(now, 'year', false) + 'y'
    }

    if (diffInSeconds > 60 * 60 * 24 * 7 * 30) {
      return date1.diff(now, 'month', false) + 'm'
    }

    if (diffInSeconds > 60 * 60 * 24 * 7) {
      return date1.diff(now, 'week', false) + 'w'
    }

    if (diffInSeconds > 60 * 60 * 24) {
      return date1.diff(now, 'day', false) + 'd'
    }

    if (diffInSeconds > 60 * 60) {
      return date1.diff(now, 'hour', false) + 'h'
    }

    if (diffInSeconds > 60) {
      return date1.diff(now, 'minute', false) + 'm'
    }

    return diff
  }

1 Ответ

1 голос
/ 19 июня 2020

A for of должен это делать, и если вы дадите day.js сравнить, у вас не будет логических ошибок:

 const timeSince = (from, to = Date.now()) => {
    to = dayjs(to);
    const units = ['year', 'month', 'week', 'day', 'hour', 'minute'];
    for (let unit of units){
        const diff = to.diff(from, unit, false);
        if(diff) {
            return diff + unit.charaAt(0); // you are using m for month and minute...
        }
    }
    // base case if there are no seconds difference
    return to.diff(now, 'second', false) + 's';

  }

// timeSince(base.createdOn)
...