Формат относительного времени в моментах

Если я использую

moment().startOf("minute").fromNow();

Я получу:

a few seconds ago
a minute ago
...

Можно ли отформатировать вывод, как показано ниже?

00:00 minutes ago
00:01 minutes ago
...

2 ответа

Решение

Вы можете настроить, как момент форматирует относительное время для вашей локали, используя updateLocale,

Обратите внимание, что документы говорят:

Если локаль требует дополнительной обработки для токена, он может установить токен как функцию со следующей подписью. Функция должна вернуть строку.

function (number, withoutSuffix, key, isFuture) {
    return string;
}

В вашем случае вы можете сделать что-то вроде этого:

var m1 = moment().subtract(5, 'm');
var m2 = moment().subtract(15, 's');

console.log(m1.fromNow());
console.log(m2.fromNow());

moment.updateLocale('en', {
    relativeTime : {
        future: "in %s",
        past:   "%s ago",
        s: function (number, withoutSuffix, key, isFuture){
            return '00:' + (number<10 ? '0':'') + number + ' minutes';
        },
        m:  "01:00 minutes",
        mm: function (number, withoutSuffix, key, isFuture){
            return (number<10 ? '0':'') + number + ':00' + ' minutes';
        },
        h:  "an hour",
        hh: "%d hours",
        d:  "a day",
        dd: "%d days",
        M:  "a month",
        MM: "%d months",
        y:  "a year",
        yy: "%d years"
    }
});


console.log(m1.fromNow());
console.log(m2.fromNow());
<script src="//cdnjs.cloudflare.com/ajax/libs/moment.js/2.14.1/moment.min.js"></script>

Я не уверен, что приведенный выше код охватывает все случаи, которые вам нужны, но я думаю, что это может быть хорошей отправной точкой.

Ты можешь использовать fromNow() метод.

moment(<time>).fromNow()
moment([2007, 0, 29]).fromNow(); // 4 years ago

Если вы пройдете trueВы можете получить значение без суффикса.

moment([2007, 0, 29]).fromNow();     // 4 years ago
moment([2007, 0, 29]).fromNow(true); // 4 years

Для получения дополнительной информации вы можете обратиться источник

Как я знаю, это невозможно, используя fromNow() функция. Вы можете сделать следующий трюк:

moment()
    .seconds(moment().diff(moment().startOf("minute"), 'seconds'))
    .format('[00]:ss [minutes ago]');

Я использую это для отображения относительного времени. Может быть, как-то это кому-нибудь поможет.

    const Moment = require('moment')
    const _      = require('lodash')    

    const duration = Moment.duration(12460923,'milliseconds')
    const durationAsDays = _.floor(duration.asDays())
    const durationAsHours = _.floor(duration.subtract( durationAsDays, 'days' ).asHours())
    const durationAsMinutes = _.floor(duration.subtract( durationAsHours, 'hours' ).asMinutes())

    let relativeDuration = ''

    if ( durationAsDays > 0  )
        relativeDuration += durationAsDays + 'd '

    if ( durationAsHours > 0 )
        relativeDuration += durationAsHours + 'h '

    if ( durationAsMinutes > 0 )
        relativeDuration += durationAsMinutes + 'm'

    console.log(relativeDuration, durationAsMinutes) // 3h 27m
Другие вопросы по тегам