Длительность момента JS показывает неправильное время? - PullRequest
0 голосов
/ 28 июня 2018

Я пытаюсь преобразовать длительность в секундах в удобную для человека информацию, используя момент js и комбинацию продолжительности и формата. Я получаю продолжительность в секундах, а затем форматирую ее так:

const value = 337650
const duration = (durationSeconds) => {
  const duration = moment.duration(durationSeconds, 'seconds')
  return moment.utc(duration.asMilliseconds()).format('D [days] HH:mm:ss')
}

console.log(`Duration: ${duration(value)}`)

выходы

"Продолжительность: 4 дня 21:47:30"

JSBin здесь

У меня проблема в том, что это кажется неправильным. Онлайн сервисы вроде https://www.tools4noobs.com/online_tools/seconds_to_hh_mm_ss/ показывают на один день меньше. Я не уверен, какую библиотеку / алгоритм используют эти сервисы и показывают ли они правильное истекшее время или момент js. Любые идеи с благодарностью!

Ответы [ 4 ]

0 голосов
/ 28 июня 2018

попробуйте что-нибудь простое:

var x = 337650%86400; 
var days = (337650 - x)/86400; 
var y = x%3600; 
var hours= (x-y)/3600; 
var sec = y%60; 
var mins=(y-sec)/60; 
alert(days + ' days ' + hours+':'+mins+':'+sec)
0 голосов
/ 28 июня 2018

Вы можете использовать плагин момента-продолжительности-формата для форматирования длительностей, предыдущий подход (создание новой абсолютной даты из продолжительности) не будет работать. Когда вы добавляете 337650 секунд к началу Unix Epoch, вы получаете 4 января 1970 года, 21:47:30, поэтому вы видите день как 4.

В качестве еще одного примера того, как все пойдет не так, представьте, что нам нужно отформатировать, скажем, 2700000 секунд. Это даст нам вывод «1 дней 06:00:00». Зачем? Потому что это эквивалентно 1 февраля 1970 года, 06:00. (Реальный результат будет 31 день, 06:00:00).

Я не думаю, что мы можем обвинить авторов moment.js (они проделали потрясающую работу), просто она не использует функцию format в moment.js, как это предполагается использовать.

Используя функцию форматирования из момента-продолжительности-формата, мы форматируем как длительность, а не как абсолютное время, и получаем правильный результат!

momentDurationFormatSetup(moment);

const value = 337650
const duration = (durationSeconds) => {
    const duration = moment.duration(durationSeconds, 'seconds')
    return duration.format('D [days] HH:mm:ss');
}

console.log(`Duration: ${duration(value)}`)
document.getElementById('output').innerHTML = `Duration: ${duration(value)}`;
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment-duration-format/2.2.2/moment-duration-format.min.js"></script>
<div id="output">
</div>

JSFiddle: https://jsfiddle.net/t07ez8o4/9/

0 голосов
/ 28 июня 2018

Простое форматирование можно выполнить с помощью гуманизированного метода:

let value = 337650
let duration = moment.duration(value, 'seconds')
duration = duration.humanize()
console.log(duration)

"4 дня"

Для более сложного форматирования, в которое вы можете погрузиться: https://github.com/jsmreese/moment-duration-format.

0 голосов
/ 28 июня 2018

Вы, кажется, конвертируете продолжительность в время эпохи, затем форматируете ее, что будет неверным.

Посмотрите на этот момент для деталей о форматировании продолжительности. https://github.com/moment/moment/issues/1048

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...