moment (). fromNow () возвращается «несколько секунд назад».
Почему не «прямо сейчас»?
Вы можете настроить это, выполнив что-то вроде moment.langData('en').relativeTime.s = "just now"
, хотя с суффиксом это выглядело бы странно.
Если хотите, вы можете создать метод, который обертывает fromNow
.
moment.fn.fromNowOrNow = function (a) {
if (Math.abs(moment().diff(this)) < 1000) { // 1000 milliseconds
return 'just now';
}
return this.fromNow(a);
}
Спасибо, Тим!
Спасибо за код. Меня устраивает «несколько секунд назад», но я часто также получаю «через несколько секунд» после завершения операции, потому что часы сервера и клиента не синхронизированы. Так что мне интересно, не имеет ли смысла показывать «только сейчас» в обоих случаях?
Да, приведенный выше код показывает «только сейчас», если это 1 секунда до или после текущего времени, поэтому, если вы хотите увеличить этот диапазон, вы можете просто изменить количество миллисекунд.
moment.fn.fromNowOrNow = function (a) {
if (Math.abs(moment().diff(this)) < 25000) { // 25 seconds before or after now
return 'just now';
}
return this.fromNow(a);
}
Спасибо, я получил это, но мне было интересно, имеет ли смысл использовать «только сейчас» в качестве поведения по умолчанию, учитывая, что просмотр прошедшего события «через несколько секунд» для большинства пользователей выглядит ошибкой.
+1, чтобы «только сейчас» быть поведением по умолчанию!
Что ж, если ваши часы не синхронизируются, у вас проблема. Я не думаю, что подходящее место для исправления - это метод очеловечивания момента. Это библиотека времени, вы говорите ей, чтобы она отображала время в будущем, и она это делает.
Другое дело, если вы хотите заменить строку «несколько секунд назад» на «только сейчас», но оставить «через несколько секунд». Также потребуется исправить все переводы ;-)
moment.langData ('ru'). relativeTime.s = "никогда"; было исправлением моей проблемы # 555
Спасибо, Тим!
Часы почти всегда будут немного рассинхронизированы при анализе временных меток, созданных сервером, в браузере. Это редкий случай использования moment.js?
Я думаю, что добавление эпсилон-значения в несколько секунд, чтобы интервалы, меньшие, чем этот в любом направлении, давали бы «только сейчас» или что-то подобное, имеет смысл, и если это значение легко изменить, оно может соответствовать ожиданиям всех - значение 0 означает текущее поведение , значение больше нуля означает борьбу со смещением браузера / сервера или аналогичным.
Что вы думаете?
Настраиваемое «эпсилон-значение» звучит как хорошая идея.
Я думаю, что более простое решение проблемы @ejain - это
var now = moment();
var mom = momentFromServer < now ? now : momentFromServer;
mom.fromNow(); //=> a few seconds ago
Если это должно быть частью Moment, я предлагаю просто сделать его логическим аргументом для fromNow()
. Или еще лучше, пусть fromNow возьмет (обратно совместимый) объект option, например fromNow({withSuffix: false, forcePast: true})
.
@icambron : отличное решение, если вы уверены, что у вас не будет
@timrwood спасибо за советы
на самом деле это moment.langData('en')._relativeTime.s = "just now"
если вы хотите заменить указанную строку.
Я очеловечиваю даты (без информации о времени), поэтому моим решением было изменение _relativeTime.s на эквивалент «сегодня» для всех языков.
fromNow (true) возвращает «2 минуты назад», «2 часа назад», «несколько секунд назад».
Как можно сделать что-то вроде «2м», «2ч», «2сек» или «2д»?
@ puneet94 Вы можете обновить строки своего языкового стандарта с помощью https://momentjs.com/docs/#/customization/relative -time /
FWIW, я смог применить «только что», используя 2.12.0, указав функцию для past
:
moment.updateLocale('en', {
relativeTime : {
past: function(input) {
return input === 'just now'
? input
: input + ' ago'
},
s : 'just now',
future: "in %s",
ss : '%d seconds',
m: "a minute",
mm: "%d 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"
}
});
@richardszalay, какой формат даты вы используете с этим и как вы это применяете?
У меня есть строка даты time = 1560955417474,
и хотите отобразить его в текстовом теге
<Text>{time}</Text>
Самый полезный комментарий
Вы можете настроить это, выполнив что-то вроде
moment.langData('en').relativeTime.s = "just now"
, хотя с суффиксом это выглядело бы странно.Если хотите, вы можете создать метод, который обертывает
fromNow
.