Я знаю, что могу сделать что-нибудь еще и еще более привлекательные Даты с моментами. Но смущающе, я с трудом пытаюсь сделать что-то, что кажется простым: получить разницу между 2 разами.
Пример:
var now = "04/09/2013 15:00:00";
var then = "04/09/2013 14:20:30";
//expected result:
"00:39:30"
что я пробовал:
var now = moment("04/09/2013 15:00:00");
var then = moment("04/09/2013 14:20:30");
console.log(moment(moment.duration(now.diff(then))).format("hh:mm:ss"))
//outputs 10:39:30
Я не понимаю, что это за "10" там. Я живу в Бразилии, поэтому мы будем UTC-0300, если это актуально.
Результатом moment.duration(now.diff(then))
является продолжительность с правильными внутренними значениями:
days: 0
hours: 0
milliseconds: 0
minutes: 39
months: 0
seconds: 30
years: 0
Итак, я думаю, мой вопрос: как преобразовать продолжительность момента в временной интервал? Я уверен, что могу использовать
duration.get("hours") +":"+ duration.get("minutes") +:+ duration.get("seconds")
но я чувствую, что есть нечто большее изящное, чего мне совершенно не хватает.
Обновление
выглядит ближе, в приведенном выше примере now
:
Tue Apr 09 2013 15:00:00 GMT-0300 (E. South America Standard Time)…}
и moment(moment.duration(now.diff(then)))
это:
Wed Dec 31 1969 22:39:30 GMT-0200 (E. South America Daylight Time)…}
Я не уверен, почему второе значение в летнее время (-0200) ... но я уверен, что я не люблю даты :(
обновление 2
ну, это значение -0200, вероятно, потому что 31.12.1969 была дата, когда использовалось летнее время ... вот и все.
Ответы:
Этот подход будет работать ТОЛЬКО в том случае, если общая продолжительность составляет менее 24 часов:
Если у вас есть 24 часа или более, часы сбрасываются на ноль с помощью вышеуказанного подхода, поэтому он не идеален.
Если вы хотите получить действительный ответ в течение 24 часов или более, вам нужно будет сделать что-то вроде этого:
Обратите внимание, что я использую время UTC в качестве ярлыка. Вы могли бы вытащить
d.minutes()
иd.seconds()
отдельности, но вам также придется обнулить их.Это необходимо, потому что в настоящее время возможность форматировать
duration
возражение отсутствует в moment.js. Это было запрошено здесь . Тем не менее, существует сторонний плагин под названием момент-продолжительность-формат, который специально для этой цели:источник
Ваша проблема заключается в передаче результата moment.duration () обратно в moment () перед его форматированием; это приводит к тому, что moment () интерпретирует его как время относительно эпохи Unix.
Это не дает вам тот формат, который вы ищете, но
moment.duration(now.diff(then)).humanize()
даст вам полезный формат, как "40 минут". Если вы действительно заинтересованы в этом конкретном форматировании, вам придется создать новую строку самостоятельно. Дешевый способ будет
[diff.asHours(), diff.minutes(), diff.seconds()].join(':')
где
var diff = moment.duration(now.diff(then))
. Это не дает вам заполнение нулями однозначных значений. Для этого вы, возможно, захотите рассмотреть что-то вроде underscore.string - хотя кажется, что это долгий путь только для нескольких дополнительных нулей. :)источник
asHours
вместоhours
, и снять десятичные дроби. В противном случае это будет та же проблема, что вы поймали в моем ответе. :)[Math.floor(diff.asHours()), diff.minutes(), diff.seconds()].join(':')
для того, чтобы получить желаемый результат. без десятичной дроби в первой частиРаботал для меня
Подробнее смотрите в http://momentjs.com/docs/#/displaying/difference/
источник
Если вы хотите, чтобы разница между двумя временными метками составляла только общее количество дней, часов и минут, а не месяцев и лет.
diff содержит 2 месяца, 23 дня, 23 часа и 20 минут. Но нам нужен результат только в днях, часах и минутах, поэтому простое решение:
Окончательный результат составит: 84 дня, 23 часа, 20 минут.
источник
Когда вы звоните
diff
, moment.js вычисляет разницу в миллисекундах. Если в миллисекундах передается значениеduration
, оно используется для вычисления правильной продолжительности. Тем не мение. когда вы передаете те же миллисекунды вmoment()
, он вычисляет дату в миллисекундах с (после) времени эпохи / юникса, которое является 1 января 1970 года (полночь UTC / GMT). Вот почему вы получаете 1969 год как неправильный час.Итак, я думаю, что это то, как вы должны это сделать, так как moment.js не предлагает
format
функции для продолжительности. Или вы можете написать простую обертку, чтобы сделать ее проще / красивее.источник
Это должно работать нормально.
источник
Если мы хотим только чч: мм: сс, мы можем использовать такую функцию:
источник
Использовать это,
источник
Вместо того
Лучше сделать
источник
В ES8 используют момент, сейчас и начинают быть моментные объекты.
источник
Машинопись: следующее должно работать,
источник
Я создаю простую функцию с машинописью
для генерации JavaScript https://www.typescriptlang.org/play/index.html
источник
InTime = 06: 38, Outtime = 15: 40
источник
ДАТА ВРЕМЯ НА ОСНОВЕ ВХОДА
ВЫВОД
источник
Эпоха разницы во времени с использованием моментов :
Чтобы получить разницу между двумя эпохами:
Синтаксис:
moment.duration(moment(moment(date1).diff(moment(date2)))).asHours()
Разница в часах:
moment.duration(moment(moment(1590597744551).diff(moment(1590597909877)))).asHours()
Разница в минутах:
moment.duration(moment(moment(1590597744551).diff(moment(1590597909877)))).asMinutes().toFixed()
Примечание: вы можете удалить
.toFixed()
если вам нужны точные значения.Код:
См. Рабочий пример здесь: https://repl.it/repls/MoccasinDearDimension
источник