Moment: Продолжительность отсутствующих функций

Созданный на 10 окт. 2012  ·  186Комментарии  ·  Источник: moment/moment

Я работаю над проектом, и momentjs действительно полезен для манипулирования датами, поэтому спасибо за это.

Например, мы делаем что-то вроде магазина для билетов на самолет. Функция duration.humanize() для нас неточна.

Например, при вылете в: 12:00 и приземлении в 13:30. Это округлит его до 2 часов. Но нам нужна какая-то детализация, которой нет в momentjs.

humanize может по умолчанию установить 1 уровень точности, начиная с наивысшего значения.

// 1:30
duration.humanize()
2 hour
duration.humanize({precision: 2})
1 hour 30 minutes
duration.humanize({precision: 3})
1 hour 30 minutes 0 seconds

Вторая проблема - когда есть число 0. Momentjs переводит его как «несколько секунд». Я не уверен, как этого добиться, но было бы здорово иметь какое-то форматирование.

// 3 days and 0 minutes
duration.format('D [and] M')
> 3 days and 0 minutes
duration.format('H [and] M')
> 72 hours and 0 minutes
duration.format('H [and] m')
> 72 hours and few minutes

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

New Feature

Самый полезный комментарий

2019, все еще нуждаются в этой функции.

Все 186 Комментарий

+1 по этому запросу

@llacroix , не могли бы вы написать для этого

Да, наверное, я постараюсь найти для этого время. Добавление его в momentjs, вероятно, сэкономит время мне и другим в долгосрочной перспективе. В настоящее время это заставляет меня создавать какой-то беспорядок повсюду, и это не идеально. Исправление momentjs кажется более подходящим.

Но нам, вероятно, следует подробнее обсудить, какой формат следует использовать. Например, должно отображаться 0 значений или нет.

4 hours 20 seconds или 0 days 4 hours 0 minutes 20 seconds

Месяцев будет 30 дней, в году 365.

И какие форматы, кроме года, месяца, недели, дня, минуты, секунды и миллисекунды, должны существовать.

+1 за это
Но да, форматирование здесь - ключевая проблема. Гуманизация и формат, безусловно, необходимы.
Некоторые предложения по гуманизации поведения:
// 1:30
duration.humanize ();
1 час 30 минут
duration.humanize ({round: "часы"})
2 часа
duration.humanize ({раунд: "минуты"})
1 час 30 минут
duration.humanize ({раунд: "секунды"})
1 час 30 минут 0 секунд

Если округление явно не определено, я думаю, что наибольшая единица, значение которой равно нулю, и все единицы, меньшие, чем она, следует опустить.

// 1 час 0 минут 45 секунд
duration.humanize () -> 1 час
// 1 час 1 минута 0 секунд
duration.humanize () -> 1 час и 1 минута
// 1 час 1 минута 10 секунд
duration.humanize () -> 1 час 1 минута 10 секунд

Кроме того, разделитель «и» следует использовать для последнего соединения, которому предшествуют пробелы.
2 месяца 6 дней 7 часов 36 минут

Вот как я предполагаю, что функция должна вести себя по умолчанию

Вот мое предложение по подписи и реализации.

var duration = moment.duration({
    hours : 1,
    minutes : 0,
    seconds : 20,
    milliseconds : 0
});
duration.countdown(); // 1 hour 0 minutes 20 seconds
duration.countdown(1); // 1 hour
duration.countdown(2); // 1 hour and 0 minutes
duration.countdown(3); // 1 hour 0 minutes and 20 seconds

Как предложил @sylvainpolletvillard , мы можем добавить параметр для обрезки обнуленных значений. Может как то так.

duration.countdown(3); // 1 hour 0 minutes and 1 second
duration.countdown(3, true); // 1 hour

Мы также можем добавить параметр для суффикса, например moment.fromNow(Boolean) .

duration.countdown(3); // 1 hour 0 minutes and 1 second ago
duration.countdown(3, null, true); // 1 hour ago

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

Вероятно, нам придется создавать обратные вызовы для языков, чтобы объединять сами строки. Эти правила, вероятно, будут очень сложными (я смотрю на вас, венгерский ).

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

var keys    = [     "h",        "mm",          "s"],
    values  = [       1,           0,           20],
    strings = ["1 hour", "0 minutes", "20 seconds"];

lang.countdown(keys, values, strings, addSuffix);

Тогда английский перевод будет примерно таким:

lang.countdown = function (keys, values, strings, addSuffix) {
    var i, output = "";

    for (i = 0; i < strings.length; i++) {
        if (i === strings.length - 1 && strings.length > 1) {
            output += "and ";
        }
        output += strings[i] + " ";
    }
    if (addSuffix) {
        output += "ago";
    }
}

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

Может, это лучше перенести в плагин?

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

moment.duration(9483000).format('d h m s') // 1 day 2 hours 20 minutes 30 seconds  
moment.duration(9483000).format('h m s') // 26 hours 20 minutes 30 seconds 
//etc...  

Может быть, предоставить логический параметр в методе форматирования, чтобы определить, показаны ли значения 0 или нет?

В CLDR есть схема форматирования списка и данные, которые можно использовать для многих языков, хотя, вероятно, для многих языков по-прежнему потребуются пользовательские обратные вызовы:

http://cldr.unicode.org/development/development-process/design-proposals/list-formatting

Я хорош для функции форматирования. Поскольку реализовать перевод на несколько языков может быть довольно сложно. Использование форматов должно быть довольно простым в реализации.

Скажем ты хочешь

moment.duration(9483000).format('d h m s') // 1 day 2 hours 20 minutes and 30 seconds  
// English  => 'd h m [and] s' 1 day 2 hours 20 minutes and 30 seconds
// French   => 'd, h, m [et] s'   1 jour, 2 heures, 20 minutes et 30 secondes
// Russian  => 'd h m [и] s'   1 день 2 часа 30 минут и 30 секунд

Нет необходимости в специальных обратных вызовах, а нужны только строки специального формата.

Предлагаемые методы duration.countdown() и duration.countdown(1) - это именно то, что я ищу (то есть то, что я сейчас делаю в собственном коде).

Между тем, есть ли способ расширить прототип Duration?

Прототип продолжительности отображается через moment.duration.fn аналогично moment.fn .

Я работал над чем-то подобным в прошлом году над # 143 / # 192. Тим предложил плагин, но я никогда не тратил на это время.

Я собирался перезагрузить свою работу. Мне пришлось обновиться до новых концепций, таких как объекты продолжительности и т. Д. Я был этим билетом и другими. Теперь я пытаюсь понять, нужно ли это еще, и если да, то как нам это реализовать.

Я не хочу наступать на вас, чтобы вы знали, могу ли я помочь. Кто сейчас работает над этим вопросом?

Мой код смог отформатировать следующие единицы и непоследовательные единицы:

test.equal(moment([2012, 0, 1]).diff([2011, 0, 1], 'years\\y'), "1y");
test.equal(moment([2012, 0, 1]).diff([2011, 0, 1], 'months[m]'), "12m");
test.equal(moment([2016, 0, 20]).diff([2011, 10, 1], 'months [months] days [days]'), "50 months 19 days");
test.equal(moment([2016, 0, 20]).diff([2011, 10, 1], 'years \\y months \\M days \\d'), "4 y 2 M 19 d");
test.equal(moment([2016, 0, 20]).diff([2011, 10, 1], 'years[y] days[d]'), "4y 80d");
test.equal(moment([2016, 0, 20]).diff([2011, 10, 1], 'years [years] weeks [weeks]'), "4 years 11 weeks");
test.equal(moment([2016, 0, 20]).diff([2011, 10, 1], 'years\\y weeks\\w [and] days [days]'), "4y 11w and 3 days");
test.equal(moment([2016, 0, 20]).diff([2011, 10, 1], 'days\\d'), "1541d");

Он не обрабатывал единицы, которые не были в порядке, например 'days years' . Он также не обрабатывал удаление нулевых значений.

Выглядит потрясающе, именно на то, на что я надеялся!

Это определенно необходимая функция для всех.

Нужно это!

В качестве возможной временной меры для некоторых из вас я создал простой плагин, который позволяет использовать countdown.js прямо из Moment:

moment("1982-5-25").countdown().toString(); // => '30 years, 10 months, 14 days, 2 hours, 23 minutes, and 50 seconds'

Он передает любые параметры обратного отсчета, которые вы ему передаете, например, какие единицы использовать и с какой точностью (вы можете посмотреть документацию обратного отсчета). В любом случае, плагин находится здесь: https://github.com/icambron/moment-countdown

@icambron, спасибо за ваш счет! Это очень полезно!

Я только начал использовать moment.js и довольно быстро столкнулся с этой проблемой. Это код, который я использовал для его решения:

moment.duration.fn.format = function (input) {
    var output = input;
    var milliseconds = this.asMilliseconds();
    var totalMilliseconds = 0;
    var replaceRegexps = {
        years: /Y(?!Y)/g,
        months: /M(?!M)/g,
        weeks: /W(?!W)/g,
        days: /D(?!D)/g,
        hours: /H(?!H)/g,
        minutes: /m(?!m)/g,
        seconds: /s(?!s)/g,
        milliseconds: /S(?!S)/g
    }
    var matchRegexps = {
        years: /Y/g,
        months: /M/g,
        weeks: /W/g,
        days: /D/g,
        hours: /H/g,
        minutes: /m/g,
        seconds: /s/g,
        milliseconds: /S/g
    }
    for (var r in replaceRegexps) {
        if (replaceRegexps[r].test(output)) {
            var as = 'as'+r.charAt(0).toUpperCase() + r.slice(1);
            var value = new String(Math.floor(moment.duration(milliseconds - totalMilliseconds)[as]()));
            var replacements = output.match(matchRegexps[r]).length - value.length;
            output = output.replace(replaceRegexps[r], value);

            while (replacements > 0 && replaceRegexps[r].test(output)) {
                output = output.replace(replaceRegexps[r], '0');
                replacements--;
            }
            output = output.replace(matchRegexps[r], '');

            var temp = {};
            temp[r] = value;
            totalMilliseconds += moment.duration(temp).asMilliseconds();
        }
    }
    return output;
}

Особенности этого кода:

  • использует те же символы формата, что описаны по адресу: http://momentjs.com/docs/#/displaying/format/
  • выводит столько ведущих нулей, сколько вы хотите для любого атрибута продолжительности, например:
d=moment.duration({hours:1,minutes:1,seconds:1});
d.format('HHH:mm:ss');
"001:01:01"
  • если вы опускаете символ в шаблоне ввода, а значение последующего символа больше, чем его обычный максимум, к нему добавляется предыдущий, например:
d=moment.duration({days:1, hours:1, minutes: 1});
d.format('H:mm:ss');
"25:01:00"

Возможные проблемы:

  • использует Math.floor для значений, полученных из asXxxx, например:
Math.floor(moment.duration(milliseconds)).asHours()
  • это будет означать, что если в продолжительности есть, например, значения для минут или секунд, но вы запрашиваете функцию форматирования для часов, тогда она не будет округляться в большую сторону, она всегда будет округляться в меньшую сторону.

+1 за этот запрос

Лично я думаю, что более разумно реализовать метод .format() чем иметь какие-то причудливые правила для .humanize() или создавать метод .countdown() . 95% проблем можно решить с помощью .format() .

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

Продолжительность форматирования обязательна. Должно быть легко перевести секунды в сформированную строку.

Я пробую код Stralytic, но:
d = moment.duration ({дни: 1, часы: 1, минуты: 1}); d.format ('DH: мм: сс');
«1 -215: 01: 00»

+1 за format()

В качестве примера использования длительности, используемые во время экзаменов (3 часа), могут быть легко отформатированы как чч: мм (: сс) или около того, что было бы намного проще. Сейчас довольно сложно сделать то же самое в Moment, пока я не попробую ванильный js :)

+1 формат продолжительности!

вот быстрое исправление, которое я использовал:

moment.duration.fn.format = function(){
    str = ""
    if(this.days() > 1) str = str + Math.floor(this.days()) + "d "
    if(this.hours() > 1) str = str + Math.floor(this.hours()) + "h "
    if(this.minutes() > 1) str = str + Math.floor(this.minutes()) + "m "
    if(this.seconds() > 1) str = str + Math.floor(this.seconds()) + "s "
    return str
    }

: +1: для duration.format()

: +1: и для duration.format () тоже

Каков статус этого PR? Это далеко?

Code Bounty

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

@llacroix Спасибо :)

: +1: для duration.format ()

 moment.duration.fn.format = function (zeros, twoDigit) {
 var hours = this.hours (), minutes = this.minutes (), seconds = this.seconds ();
 var displayFormat = '', zerosFormat = twoDigit? '00': '0', padLeft = twoDigit? -2: -1;
 if (часы || нули) {
 displayFormat + = (zerosFormat + часы) .slice (padLeft) + 'h';
 }
 if (минуты || нули) {
 displayFormat + = (zerosFormat + minutes) .slice (padLeft) + 'мин';
 }
 if (секунды || нули) {
 displayFormat + = (zerosFormat + секунды) .slice (padLeft) + 's';
 }
 вернуть $ .trim (displayFormat);
 }

+1 формат продолжительности.

+1 duration.format

+1 duration.format

Мне действительно нужно было полное форматирование продолжительности, поэтому я просмотрел темы здесь и на StackOverflow и сел сегодня, чтобы реализовать его.

Я все еще прорабатываю пару мелких деталей, но ядро ​​готово и прочно. Я отправлю сюда код, спецификации и примеры в ближайшие несколько дней. Основная идея заключается в том, что вы можете иметь любую произвольную продолжительность и форматировать ее строкой, аналогичной строкам формата даты момента, например. duration.format ("д [д] чч: мм: сс") -> 2d 03:47:24

Вы также можете определить произвольную десятичную точность конечного значения, например. duration.format ("h [hrs]", 3) -> 42,384 часа

+1 для duration.format

Я разместил свой плагин moment.duration.format:
https://github.com/jsmreese/moment-duration-format

Тест-кейсы и несколько примеров есть в проекте.
Мой плагин зависит от lodash и underscore.string.

+1 duration.format ()

Этот билет был открыт больше года назад. Я сомневаюсь, что это когда-нибудь будет реализовано.

@ Maxwell2022 Неделю назад я опубликовал плагин moment.duration.format:
https://github.com/jsmreese/moment-duration-format

Это сработает для вас?

+1 к этому тоже. Похоже на очень заметное упущение в обширной библиотеке.

https://github.com/rmm5t/jquery-timeago может быть хорошим шаблоном того, как мы можем реализовать это в Moment ...

@schmod В прошлом месяце я опубликовал плагин moment.duration.format:
https://github.com/jsmreese/moment-duration-format

Это работает для ваших вариантов использования?

: +1:!

Это сработает для меня (но не для продолжительности> 24 часов):

moment.duration.fn.format = function(format) {
  return moment(this.as('milliseconds')).format(format);
}

@jsmreese, что ваш https://github.com/jsmreese/moment-duration-format зависит от LoDash, - это настоящий стоп-сигнал. Мы уже используем подчеркивание, и я не могу оправдать переход на LoDash только из-за этой маленькой функции. Если бы ваш плагин был независим от обоих, я думаю, это сделало бы его более жизнеспособным вариантом для многих людей.

@wleeper Абсолютно согласен.

Моя среда использует LoDash и Underscore.String, поэтому я использовал методы из этих библиотек - мне нужна была моя первая версия пару месяцев назад, и я просто хотел, чтобы она была реализована и там.

Я скоро удалю эти зависимости.

@wleeper Underscore и LoDash предназначены для взаимной совместимости. Пока @jsmreese не использует ничего, кроме Underscore-сборки LoDash, вы сможете без проблем использовать его плагин как есть.

@ chall8908 Вот в чем дело, и @wleeper прав - я _am_ использую функции LoDash, которые не являются частью сборки Underscore.

Я удалил зависимость Underscore.String и работаю над совместимостью Underscore.

Хотя плагин формата времени-момента решает одну из этих проблем, я думаю, что нам нужен подход, который работает в разных регионах (что, по общему признанию, намного сложнее).

Я думаю, что нам нужно работать над реализацией # 1241, которая откроет много дверей с точки зрения отображения удобочитаемых дат, относительных дат, продолжительности и списков в разных регионах. formatDuration было бы довольно просто реализовать, если бы Moment имел доступ к данным языка CLDR.

Библиотека Globalize jQuery работает над решением многих из тех же проблем, и кажется логичным сотрудничать с ними. У Twitter также уже есть очень обширная библиотека, которая делает много такого рода вещей ...

Хорошо, вот реализуемый API поверх CLDR. Что вы думаете?

duration:human(bool) // future/past dep/indep
duration:human({
  with(=min+max): 'hours'|'minutes'|'seconds',
  min: 'hours',
  max: 'days',
  float: bool,
  length: "long|short|narrow",
  abs: bool
})
  • min: какова минимальная единица измерения. min: days, означает не часы, минуты, секунды, а округление до дней, если продолжительность меньше одного дня
  • max: какова максимальная единица измерения. max: days, означает не использовать месяцы и годы, а вместо этого использовать соответствующее количество дней
  • длина: размер токенов: день vs d для английского языка
  • абс: будущее / прошлое независимое

: +1: +1

: +1:

+1 duration.format

+1 duration.format

+1

+1

+1

Хотелось бы, чтобы это отображало время выполнения чего-то.

+1

https://github.com/jsmreese/moment-duration-format

Версия 1.2.1 формата момента-длительности опубликована на NPM.
Он работает как в Node.js, так и в браузере.
Это зависит от Lo-Dash или Underscore, но теперь протестировано и работает с обоими.
Исходная зависимость Underscore.String была удалена.

Я опубликую эту версию в Bower, как только будут решены текущие проблемы регистрации / отмены регистрации пакета Bower.

+1 для формата продолжительности

Хотелось бы, чтобы это стало частью библиотеки.

+1

+1

+1

: +1:

+1 для duration.format ()

+1

О да, я бы определенно был там, по крайней мере, чтобы иметь возможность делать moment.duration(3, 'seconds').get('ss') для вывода с начальными нулевыми значениями.

В каком состоянии находится этот запрос? Какая помощь нужна, чтобы добиться в этом прогресса?

@oncletom
Это существует: https://github.com/jsmreese/moment-duration-format/
И можете делать все, что хотите, если не возражаете против зависимости от Lo-Dash или Underscore.
Когда-нибудь скоро я найду время, чтобы убрать эту зависимость ...

был удивлен, что https://github.com/jsmreese/moment-duration-format/ отсутствует в stdlib, когда есть humanize . Я чувствую, что это нарушает принцип наименьшего удивления. По крайней мере, должно быть возможно вернуться к простому числовому формату:

moment.duration(123, "minutes").format();
// "2:03:00"

На данный момент я использую:

moment.utc(moment.duration(300 * 1000).asMilliseconds()).format("HH:mm:ss.SSS")
// 00:05:00.000

Хотелось бы увидеть это в ближайшее время в составе moment.js

+1

+1

Кстати, duration.toString() возвращает [Object object] . Разве он не должен возвращать humanize() ?

+1 хотел бы иметь больше контроля над этим.

+1

Только что опубликовал Moment Duration Format 1.3.0, который удаляет предыдущую зависимость от Lo-Dash или Underscore. Теперь единственная зависимость - это сам Moment.js.

https://github.com/jsmreese/moment-duration-format/

@jsmreese Хороший мужчина! : пиво:

@jsmreese круто. !
Почему это не было частью самого moment.js, я не понимаю. humanize не так полезен без точности, зачем мне округлять 1 час 30 минут до 1 часа? .. Для этого нет варианта использования.

+1, плагин от jsmreese работает блестяще, но было бы неплохо, если бы он был частью moment.js.

+1. Эта функция должна быть как внутри, так и снаружи.

+1 для duration.format

@jsmreese опубликовал свой плагин около года назад, а этот выпуск был открыт два года назад. @timrwood @ichernev Можно, пожалуйста,

+1

+1

: +1: для duration.format

+1

: +1:

+1

Каков текущий статус этого?

Может, сопровождающий ждет, когда мы дойдем до 1000, или до Нового года? @icambron

@gkatsanos - Я больше не участвую в поддержке Moment (и всегда был просто помощником), но моя рекомендация - это хорошо протестированный запрос на перенос. Наверняка есть кто-то, кто просит об этом, желающий на самом деле это кодировать.

@icambron это уже существует как плагин .. что еще делать?
кто, кстати, сопровождающий?

@icambron, не могли бы вы указать на плагин?

и, похоже, это плагин очень хорошей формы. за исключением того факта, что это зависит от lodash вместо underscore , есть ли какие-либо другие вещи, которые мешают сделать это как PR ... похоже, это порт с lodash на underscore не должно быть так сложно. / cc @jsmreese

@alexanderbeletsky @gkatsanos На самом деле я удалил зависимость lodash или underscore .

Одним из основных препятствий для включения моего плагина в ядро ​​Moment.js является отсутствие полной поддержки i18n.

И лично меня это очень беспокоит. Поддержка нескольких языков очень важна для меня, и мне не хотелось бы попадать в ситуацию, когда функция A работает на любом языке, а функция B доступна только на английском языке.

@jsmreese, может быть, если создать несколько четко определенных задач в вашем репозитории, о том, что именно нужно сделать - я бы определенно вскочил, чтобы помочь.

@mattgrande @alexanderbeletsky Маркеры формата уже настраиваются, а шаблон формата произвольный, так что это не проблема.

Шаблоны формата по умолчанию никоим образом не локализованы, и вы не можете локализовать десятичную точку или добавить какое-либо локализованное числовое форматирование к значениям. Это все, чего мне не хватает в голове.

: +1:

+1 длительность. Формат!

тааак .... в чем дело с этим?

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

  1. Все, вы можете просто использовать плагин @jsmreese . Это выглядит здорово! Плагины - это хорошо! ( @jsmreese , если вы так склонны, вы можете добавить его в список плагинов Moment в документации с PR здесь: https://github.com/moment/momentjs.com)
  2. Он не будет включен в ядро ​​Moment до тех пор, пока кто-то а) не интернационализирует его, б) интегрирует тесты в тесты Moment и в) не отправит PR. Этого точно не произойдет, пока кто-то этого не сделает .

+1 duration.format

+1 длительность. Формат!

+1 duration.format

+1 длительность. Формат. В нашем случае мы хотим предоставить функцию, в которую можно передать количество секунд и строку, которая будет их форматировать. Прямо сейчас мы делаем это с moment.startof ("w"). Add ("s", nrOfSeconds) .format (customFormatString);

К сожалению, только на прошлой неделе это привело к ошибке, так как startof ("w") - воскресенье, а в воскресенье было летнее время, поэтому нам не хватало часа. Конечно, мы можем проверить это с помощью isDSTShifted (), но все равно было бы здорово не преобразовывать длительность в дату только для ее форматирования.

+1 duration.format

+1 duration.format

+1 за duration.format

+1 для duration.format

Можем ли мы закрыть это, поскольку очевидно, что никто + 1ing действительно не читает эту ветку?

В среду, 10 июня 2015 г., 08:30 SamFromDaUk [email protected] написал:

+1 для duration.format

-
Ответьте на это письмо напрямую или просмотрите его на GitHub
https://github.com/moment/moment/issues/463#issuecomment -110751635.

ИЛИ исправить?

Джордж, я думаю, что те, кто добавляет +1, явно не согласны, и
просто хочу эти функции.

Если уведомления вас раздражают, рассмотрите возможность отказа от подписки на этот
нить.
11 июня 2015 г., 00:07, «Джордж Катсанос» [email protected] написал:

ИЛИ исправить?

-
Ответьте на это письмо напрямую или просмотрите его на GitHub
https://github.com/moment/moment/issues/463#issuecomment -110767322.

Вся причина, по которой в github нет функции голосования (насколько я понимаю), заключается в том, что она мешает обсуждению.

Вы можете безоговорочно не соглашаться со всем, что хотите, это бесполезно. Если вы не согласны, это замечательно, прочтите ветку и приведите свои аргументы (в частности, любые новые аргументы или любые моменты, которые, по вашему мнению, были плохо учтены).

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

Я могу подтвердить, что упомянутый выше плагин @icambron работает.

Если вы похожи на меня, вам нужен .fromNow() с более широким выводом (например, обратный отсчет отгрузки Amazon). Вот как это сделать:

// include the plugin
var cutoffDate = moment().add(3, 'hours'); // some date in the future that we're counting down to
var now = moment();
var output = moment.duration(cutoffDate.diff(now)).format('h [hours] m [minutes] s [seconds]');
// "3 hours 0 minutes 0 seconds"

да, я также поясню - moment.duration (). format () работает с этим плагином: https://github.com/jsmreese/moment-duration-format

если вы используете метеор, выберите oaf:moment-duration-format

Похоже, у меня это не работает, я использую момент .diff между двумя значениями времени, который действительно работает, проблема в том, что он находится между "вечера" и "утра", скажем, я еду в 9 вечера и приземляюсь. 2 часа ночи, у меня должно быть правильное количество времени.

@ Markj89 вам нужно открыть тему stackoverflow.

+1

+1

+1

: +1:

+1 при закрытии этого вопроса. использование плагина - надежное решение.

+1

+1

+1 к .format()

+1, все еще не реализовано через 4 года? : D

+1

Кстати. Я думаю, что можно будет разобрать и гуманизированный формат. Например, не так сложно разобрать 7 days and 5 hours ...

Просто хотел подчеркнуть, что плагин @jsmreese отлично работает!

: +1:

+1 duration.format

+1 формат продолжительности

+1 duration.format

+1 duration.format

: +1:

Я собираюсь закрыть это в пользу # 1048. Это не значит, что его больше нет, просто у нас было две проблемы, которым несколько лет, и обе сводятся к «форматированию продолжительности». Другой объясняет это более ясно.

+1 duration.format

+1 duration.format

+1

Используйте .localeData (). RelativeTime (45, true, 'mm') и получите 45 минут и так далее;)

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

чтобы отобразить продолжительность в любом формате, просто преобразуйте длительность в мс, а затем в момент:
moment(duration.as('milliseconds')).format('HH:mm:ss')

Благодаря! Это в документации? Я этого не видел ...

Этого нет в документации, потому что это не работает. Это хак, использующий эпоху unix для интерпретации миллисекунд как момента времени с эпохи. Таким образом, он разваливается, если ваша продолжительность составляет 24 часа или больше.

Несколько слов об этом коде:

  1. Токен hh - это токен, предназначенный для использования с AM / PM, поэтому ваша продолжительность увеличится только до 12.

  2. Даже если вы используете токен HH, который увеличится до 23, ваша продолжительность не может быть больше 23: 59: 59.999, так как все перейдет на следующую дату.

  3. Поскольку этот код написан, он будет работать только на сервере, который находится в UTC. Любой браузер в другом часовом поясе даст неожиданные результаты.

Если вы хотите использовать этот хак, его нужно записать так:

moment.utc(duration.as('milliseconds')).format('HH:mm:ss')

Но, как я уже отмечал, это будет работать, только если ваша продолжительность меньше 24 часов. Вернемся к квадрату 1.

Благодарю. Сегодня мне потребовалось некоторое время, чтобы понять, что можно объединить .minutes() с .seconds() . Назовите меня глупым, но из документации для меня не было очевидно, в чем разница между .seconds() и .asSeconds() сразу ... Но теперь я вижу, что это действительно так! :)

например: console.log(duration.minutes()+":"+duration.seconds());

Я буду придерживаться этого метода.

@elasticsteve Вы, вероятно, также захотите добавить ведущий ноль к секундам, если он меньше десяти. : wink:

@butterflyhug @elasticsteve это основная причина, по которой я хотел использовать format . в моем случае это простой краткосрочный счетчик, поэтому решения @maggiepint достаточно для моих нужд.
moment.utc(duration.asMilliseconds()).format('HH:mm:ss')

@sagivo хороший момент! Теперь решение @maggiepint выглядит более привлекательно. В любом случае мой сервер - UTC.

Конечно, я полностью понимаю. Я также использовал этот прием в производственном коде. Но я бы не рекомендовал его в качестве общего решения (за исключением нескольких конкретных случаев использования), потому что есть множество ситуаций, когда он терпит неудачу. (Например, отрицательная длительность - еще один важный случай отказа, о котором еще не упоминалось.)

+1

+1 duration.format () !!!!!!!!!

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1 длительность трудной отладки

+1

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

    var duration = moment().add(5, 'days') -  moment().local();
    var s = Math.floor( (duration/1000) % 60 );
    var m = Math.floor( (duration/1000/60) % 60 );
    var h = Math.floor( (duration/(1000*60*60)) % 24 );
    var d = Math.floor( duration/(1000*60*60*24) );
    return d + ' days ' + h + ' hours ' + m + ' minutes ' + s  + ' seconds before the deadline.';   
    // 4 days 23 hours 59 minutes 59 seconds before the deadline.

Запросите одного пользователя twitter @Toon_Ladyboy

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

    var duration = moment().add(5, 'days') -  moment().local();
    var s = Math.floor( (duration/1000) % 60 );
    var m = Math.floor( (duration/1000/60) % 60 );
    var h = Math.floor( (duration/(1000*60*60)) % 24 );
    var d = Math.floor( duration/(1000*60*60*24) );
    return d + ' days ' + h + ' hours ' + m + ' minutes ' + s  + ' seconds before the deadline.';   
    // 4 days 23 hours 59 minutes 59 seconds before the deadline.

Уродливо, но эффективно.

2019, все еще нуждаются в этой функции.

Простого параметра в humanize, .eg humanize(precise: true) , который обходил бы все округления, было бы достаточно, чтобы все остались довольны. Кроме того, сложнее всего реализовать округление. Остальное - это просто преобразование продолжительности, как и при любом другом форматировании, выполненном с помощью format ().

Существует отличный метод moment называемый fromNow() , который возвращает время определенного времени в удобной для восприятия человеком форме, например:

moment('2019-04-30T07:30:53.000Z').fromNow() // an hour ago || a day ago || 10 days ago

Или, если вы хотите, чтобы между двумя конкретными датами вы могли использовать:

var a = moment([2007, 0, 28]);
var b = moment([2007, 0, 29]);
a.from(b); // "a day ago"

Взято из Документов:

Можно ли его снова открыть? Это очень простая функциональность.

В моем случае я нашел пакет, который решил мои проблемы:
https://github.com/EvanHahn/HumanizeDuration.js

Может быть, это пригодится и кому-то другому. :)

Июль 2019 г., и эта функция все еще недоступна.

Июль 2019 г., и эта функция все еще недоступна.

Еще не пробовал, но только что заметил!
npm install moment-duration-format

https://github.com/jsmreese/moment-duration-format

Сентябрь 2019 года по-прежнему официально не хватает этой функции

d.format('H:mm:ss');
"1:01:01"

Также желаю, чтобы у него была эта функция

d.format('D-H:mm:ss'); // existence of D will mod hours to 24
"999-23:59:59"

Если кому-то было интересно, почему это было закрыто: https://github.com/moment/moment/issues/463#issuecomment -228543000

Это ни в коем случае не идеально, но в итоге я сделал что-то подобное в качестве обходного пути. У меня был объект duration с обратным отсчетом для выхода пользователя из системы после бездействия, и я хотел отформатировать оставшееся время.

// What I did:
private getTimeString(duration: moment.Duration): string {
    const time = moment()
      .seconds(duration.seconds())
      .minutes(duration.minutes());

    return time.format('mm:ss');
}

// What I'd rather do (as many others have mentioned)...
private getTimeString(duration: moment.Duration): string {
    return duration.format('mm:ss');
}

Мое хакерское решение:

import moment from 'moment';

const formatInt = (int: number): string => {
  if (int < 10) {
    return `0${int}`;
  }
  return `${int}`;
};

export const formatDuration = (time: string): string => {
  const seconds = moment.duration(time).seconds();
  const minutes = moment.duration(time).minutes();
  const hours = moment.duration(time).hours();
  if (hours > 0) {
    return `${formatInt(hours)}:${formatInt(minutes)}:${formatInt(seconds)}`;
  }
  if (minutes > 0) {
    return `${formatInt(minutes)}:${formatInt(seconds)}`;
  }
  return `00:${formatInt(seconds)}`;
};

2020 г.

Я использую следующий метод, может кому-нибудь пригодится :)

function formatDuration(duration, format) {
  const date = moment().startOf('day');
  return date.add(duration).format(format);
}

(Я использую только для форматирования продолжительности между 00:00 и 23:59)

Все еще нужно это

Эти get помогают отформатировать так, как вы хотите:

  duration.get('years')
  duration.get('months')
  duration.get('days')
  duration.get('hours')
  duration.get('minutes')
  duration.get('seconds')

С чем я работаю:

const formatDuration = ms => {
  const days = Math.floor(ms / 8.64e7);
  const msOnLastDay = ms - days * 8.64e7;
  return (days < 10 ? "0" + days : days) + ":" + moment.utc(msOnLastDay).format("HH:mm:ss.SSS");
};
formatDuration(5)
"00:00:00:00.005"
formatDuration(500)
"00:00:00:00.500"
formatDuration(50000)
"00:00:00:50.000"
formatDuration(5000000)
"00:01:23:20.000"
formatDuration(500000000)
"05:18:53:20.000"
// for reference
JSON.stringify(moment.duration(500000000)._data, null, 2)
"{
  "milliseconds": 0,
  "seconds": 20,
  "minutes": 53,
  "hours": 18,
  "days": 5,
  "months": 0,
  "years": 0
}"

Июль 2019 г., и эта функция все еще недоступна.

Еще не пробовал, но только что заметил!
npm install moment-duration-format

https://github.com/jsmreese/moment-duration-format

Это отлично работает :)

Игра окончена :)

Спасибо, цените это !!!


De: Алексей Макас [email protected]
Дата выхода: sexta-feira, 9 de outubro de 2020 11:03
Пункт: moment / moment [email protected]
Копия: Дуглас Агиар [email protected] ; Комментарий [email protected]
Assunto: Re: [момент / момент] Продолжительность отсутствующих функций (# 463)

Игра окончена :)

-
Вы получили это, потому что оставили комментарий.
Ответьте на это электронное письмо напрямую, просмотрите его на GitHub https://github.com/moment/moment/issues/463#issuecomment-706200427 или откажитесь от подписки https://github.com/notifications/unsubscribe-auth/AGD22DRNGNIQMOJFQY7VW3DSJ4J4VANCN .

Была ли эта страница полезной?
5 / 5 - 1 рейтинги