Локализуйте "длительность" или "оставшееся время" из миллисекунд
Позвольте мне предварить это, сказав, что у меня есть "рабочее" решение, частично взятое из этой предыдущей темы:
Как конвертировать время миллисекунды в часы, минуты, секунды в формате JavaScript?
Моя цель состоит в том, чтобы взять время в миллисекундах и преобразовать его в удобочитаемое человеком, используя технологии локализации / интернационализации. Входное значение указывается в миллисекундах и является движущейся целью, потому что это ETA (расчетное время прибытия), а не точное время прибытия. Постоянно пересчитывается.
То, что я придумал, работает. То, что я ищу, это то, что может использовать моменты (потому что у него уже есть система локализации). В частности, это не должно быть моментально, но я хочу что-то более элегантное, особенно когда дело доходит до локализации. Я также использую и, следовательно, имею доступ ко всему, что предоставляется i18next.
Вот сокращенная версия текущего решения (оно находится внутри литерала объекта служебных функций):
function duration (millis) {
// in actual code, a function "i18n.t(key)" would return a properly
// localized string. Instead, I'll just store English strings in an object
var mockTranslation = {
hoursLabel: "hr",
minutesLabel: "min",
secondsLabel: "s"
}
millis = parseInt(millis);
function msToTime(duration) {
var milliseconds = parseInt((duration%1000)/100)
, seconds = parseInt((duration/1000)%60)
, minutes = parseInt((duration/(1000*60))%60)
, hours = parseInt((duration/(1000*60*60))%24);
hours = (hours < 10) ? "0" + hours : hours;
minutes = (minutes < 10) ? "0" + minutes : minutes;
seconds = (seconds < 10) ? "0" + seconds : seconds;
return {
hours : hours,
minutes: minutes,
seconds: seconds,
milliseconds: milliseconds
}
}
var converted = msToTime(millis);
var final = "" + converted.hours + " " + mockTranslation.hoursLabel
+ " " + converted.minutes + " " + mockTranslation.minutesLabel
+ " " + converted.seconds + " " + mockTranslation.secondsLabel;
return final;
}
// test with a sample input of 416000 ms.
console.log(duration(416000)); // 00 hr 06 min 56 s
В этом случае я использую подход, аналогичный исходному потоку, но возвращаю пригодный для использования объект вместо автоматического преобразования в строку. В моем реальном коде у меня есть некоторые другие условия, которые я пропускаю, и некоторые опции, которые будут возвращать значение, которое не локализовано. Но здесь мы видим, что я беру объект и объединяю его с некоторыми языковыми записями, предоставленными i18next. Вот где происходит локализация.
Тем не менее, мне кажется, что длительность времени имеет для них больше, чем обмен единицами измерения.
Использование моментов кажется излишним, но, несмотря на это, я просто не вижу функций продолжительности. Все функции, связанные с датой.
Поскольку я чувствую, что мое решение не очень гибкое и что локализация несколько второстепенная, кто-нибудь знает о лучшем подходе?
1 ответ
Существует возможность отображать длительность в миллисекундах, используя момент.js в удобочитаемом виде:
moment.duration(416000).humanize();
Код выше возвращает: 7 minutes
, Это то, что вам нужно?
Конечно, вы можете использовать i18n из moment.js. Вам просто нужно позвонить:
moment.locale('es');
moment.duration(416000).humanize();
получить длительность в испанской локализации (7 minutos
).
Если вам нужен более подробный результат (6 minutes 56 seconds
) взгляните на эту библиотеку: https://github.com/EvanHahn/HumanizeDuration.js