Moment: форматирование длительности

Созданный на 5 сент. 2013  ·  118Комментарии  ·  Источник: moment/moment

Мы уже касались этого раньше в № 463 и № 879, но никогда не говорили об этом напрямую в отдельном выпуске.

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

moment.duration(x).format("H:mm:ss")

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

  • hh будет означать «оставшиеся часы после учета дней»
  • h будет однозначной формой hh
  • HH будет означать "всего часов"
  • H будет однозначной формой HH
  • HHH будет означать "общее количество часов, включая десятичные знаки" - хотя в настоящее время это можно сделать с помощью duration.asHours() , так что это может не понадобиться.

Аналогичное форматирование применимо и к другим единицам. В этом контексте высшей единицей будет «день», то есть стандартный день, состоящий из 24 стандартных часов. Было бы бессмысленно измерять года или месяцы этим из-за проблем с календарем.

Обратите внимание, что это появилось недавно (снова) в StackOverflow в этом вопросе . Пользователь искал что-то вроде duration.format("H:mm:ss") . Это обходной путь:

Math.floor(duration.asHours()) + moment.utc(duration.asMilliseconds()).format(":mm:ss")

Это работает, но кажется хакерским. Это должно быть встроено.

New Feature Up-For-Grabs

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

Не лучше ли сделать

moment.utc(total.asMilliseconds()).format("HH:mm:ss");

вместо

Math.floor(duration.asHours()) + moment.utc(duration.asMilliseconds()).format(":mm:ss")

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

+1

moment.duration(x).format("H:mm:ss") было именно то, что я ожидал, прежде чем понял, что это не сработает. Обходной путь, предложенный Мэттом, работал нормально, но по сравнению с элегантностью других вещей в моментах он, безусловно, кажется хакерским.

Не лучше ли сделать

moment.utc(total.asMilliseconds()).format("HH:mm:ss");

вместо

Math.floor(duration.asHours()) + moment.utc(duration.asMilliseconds()).format(":mm:ss")

Code Bounty

@RobinvdVleuten - проблема с использованием HH в текущем форматировщике заключается в том, что он представляет час _partion_ полной даты и времени. Когда речь идет о _прошедшем_ времени, вполне может быть 24 часа или больше. Попробуйте пройти 24 часа, и вы увидите, что он сбрасывается до нуля.

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

Вы думаете, что будет только один «уровень» возможного остатка - например, нельзя сказать «часы после учета месяцев»? Я думаю, что это вполне разумное ограничение, но на секундочку, я мог бы представить себе аргумент «привязки», например:

moment.duration(x).format("hh:mm:ss", "M");

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

moment.duration(x).format("hh:ss");

... секунды будут по модулю часов.

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

А если серьезно, то как вы собираетесь работать с месяцами и минутами с этим обозначением строчными и прописными буквами?

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

Имеет смысл.

Я читал документ SCORM 2004 RTE (p77) и обнаружил, что представление временного интервала выглядит следующим образом, я думаю, что это исходит из стандарта,

теоретически я могу передать значение, например: P34H
и парсеры должны интерпретировать это как 1 день и 10 часов

я надеюсь, что можно было бы отформатировать вывод с учетом этого
как "ПХМ"
и средство форматирования интерпретирует это как общее количество часов, оставшихся минут?
я хотел бы иметь возможность форматировать вывод как ЧЧ:ММ

я надеюсь, что эта информация полезна

интервал времени (секунда, 10,2): интервал времени (секунда, 10, 2) означает, что значение для
элемент модели данных timeinterval представляет прошедшее время с точностью 0,01.
секунды[1]. Привязка точечной нотации SCORM определяет конкретный формат для
строка символов для представления временного интервала.
Формат строки символов должен быть следующим:
P[yY][mM][dD][T[hH][nM][s[.s]S]], где:
• y: количество лет (целое число, >= 0, без ограничений)
• m: количество месяцев (целое, >=0, без ограничений)
• d: количество дней (целое, >=0, без ограничений)
• h: количество часов (целое число, >=0, без ограничений)
• n: количество минут (целое, >=0, без ограничений)
• s: количество секунд или доля секунд (действительное или целое число, >=0, а не
ограниченный). Если используются доли секунды, SCORM дополнительно ограничивает строку до
максимум 2 цифры (например, 34,45 — допустимо, 34,45454545 — недействительно).
• Обозначения символьных литералов P, Y, M, D, T, H, Man и S должны появляться, если
присутствует соответствующее ненулевое значение.
• Должно поддерживаться заполнение значений нулями. Заполнение нулями не меняет
целочисленное значение числа, представленное набором символов. За
например, PT05H эквивалентен PT5H и PT000005H.
Пример:
• P1Y3M2DT3H указывает период времени 1 год, 3 месяца, 2 дня и 3 часа.
• PT3H5M указывает период времени 3 часа 5 минут.

Разработчики должны знать, что формат и привязка предназначены для передачи
данные между SCO и LMS. Поскольку формат представляет период времени,
тогда такая продолжительность, как PT5M, эквивалентна PT300S.
Если элемент модели данных типа timeinterval(second,10,2) содержит значение, то
• Должен присутствовать назначающий P;
• Если значение лет, месяцев, дней, часов, минут или секунд равно нулю, значение
и соответствующее буквенное обозначение может быть опущено, но по крайней мере одно
буквенное обозначение символа и значение должны присутствовать в дополнение к обозначению
П;
• Обозначение T должно быть опущено, если все компоненты времени (часы, минуты)
и секунды) не используются. Нулевое значение может быть использовано с любым временем
компоненты (например, PT0S).

Форматирование длительности было бы отличным дополнением. Нет необходимости в двух разных «часовых» токенах. Предположим, что продолжительность 32 часа. Вы бы никогда не захотели извлечь всего 8 часов, не извлекая при этом 1 день.

Я думаю, у @icambron есть хорошее предложение. Разделите строку формата на токены и выразите продолжительность в терминах наибольшей единицы. Анализируйте маркеры по одному по порядку (например, «DD:hh:ss» означает количество полных дней, количество полных часов после учета дней, количество полных секунд после учета дней + часов).

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

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

@jsmreese Рассматривали ли вы возможность подать запрос на включение, который содержит ваш плагин в качестве основной части momentjs?

@hotzenklotz Да, я рассматривал возможность подачи запроса на включение.

Я не сделал этого по всем причинам, изложенным @icambron в № 1538.

Мой плагин:

  • зависит от Lo-Dash
  • не выглядит и не похож на код Moment.js
  • использует совершенно другую тестовую установку

Я бы _любил_, чтобы мой плагин стал частью ядра Moment.js... но я не собираюсь тратить их время на пул-реквест до тех пор, пока эти проблемы не будут решены.

Мы также хотели бы убедиться, что код может быть интернационализирован. К счастью, большинство строк, которые нам понадобятся, находятся в Unicode CLDR, так что потребуется очень мало работы по переводу.

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

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

Английский (США) Данные календаря

Только что опубликована новая версия формата длительности момента, которая удаляет предыдущую зависимость от Lo-Dash или Underscore.

https://github.com/jsmreese/формат-момент-длительность

@jsmreese идеально подходит для наших нужд. Спасибо!

+1

+1

+1

+1

+1

+1

+1

+1

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

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

Синтаксис hh / h , описанный выше, кажется значительным отклонением от токенов форматирования, используемых в ISO8601, CLDR и Apache , и я бы предпочел избегать его, если это вообще возможно.

Лучшим предложением может быть вывод об использовании наиболее значимой единицы в шаблоне форматирования в качестве модуля, поэтому h:mm:ss будет отображать «нормальное» время, но считать часы после 24 (например, 26:30:00). Неясно, как можно было бы даже вычислить шаблон, подобный "HH:MM:ss" , или каков был бы вариант его использования. Разрешение разработчикам переопределять это поведение также может легко стать источником ошибок.

В духе «i18n везде» CLDR определяет форматы длительности для:

  • Часы + минуты ( h:mm в EN-US)
  • Часы + минуты + секунды ( h:mm:ss в EN-US)
  • Минуты + секунды ( m:ss в EN-US)
    и может иметь смысл предоставить константы, зависящие от локали (аналогичные форматам даты LLL ) для этих промежутков времени.

К сожалению, форматирование длительности с единицами, превышающими часы, очень сложно выразить с помощью одной строки форматирования (благодаря правилам множественного числа, которые вам необходимо учитывать), и я не смог найти _никакую_ библиотеку на любом языке, который допускает простое, удобное для i18n форматирование длительности более 24 часов. Лучшее, что вы можете сделать, это расширить duration.humanize() , чтобы принять некоторые дополнительные параметры, эффективно реализовав исходное предложение в #463.

Короче говоря, внедрение duration.format() может быть не очень хорошей идеей, так как я вижу, что любое потенциальное решение имеет значительные подводные камни. Лучше всего было бы улучшить duration.humanize() или реализовать урезанный duration.format() , который понимает только часы, минуты и секунды.

+1

Если вам нужна быстрая функция для добавления отступов:

function padWithZero(input, length) {
    // Cast input to string
    input = "" + input;

    let paddingSize = Math.max(0, length - input.length);
    return new Array(paddingSize > 0 ? paddingSize + 1 : 0).join("0") + input;
}

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

:+1:

:+1: момент удивления так не делает, обычно он меня никогда не подводил!

+1 Я использовал формат момент-длительность, указанный выше, но он не интернационализирован. Я пытаюсь вывести дни, и мне, вероятно, понадобятся месяцы, которым действительно нужны метки.

Есть ли прогресс в этом вопросе?

+1

+1

+1

+1

:+1:

+1
почему его до сих пор нет в ядре?

+1 +1 +1 +1 +1

+1

+2

@jsmreese поддерживает ли ваш плагин i18n?

@rumeshwick : может быть? Это действительно зависит от того, как вы делаете i18n и чего вы ожидаете от моего плагина.

+1

Я узнал, что это возможно таким хакерским способом:

  var dur = moment.duration('PT90M');
  moment(dur._data).format('[it\'s] D [days and] h [hour]');

Это дает:

"это 1 день и 1 час"

Однако вы не можете напечатать что-то вроде «это 1 день и 90 минут».
Для моих целей этого достаточно.
Он не включает i18n, но в моем случае я не хочу, чтобы это решалось с помощью moment.js.

Привет, у меня есть помощник Ember.JS для этого:

https://github.com/ember-building-blocks/ember-hbs-date-helpers

+1

+1 за хакерский способ @vanthome : +1:

@jsmreese - не хотели бы вы объединить свой плагин с ядром момента? Это было бы очень полезно и очень ценно.

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

@ mj1856 определенно заинтересован. Я свяжусь с вами по электронной почте с несколькими вопросами.

Ура! Так держать, @jsmreese и @mj1856!!! :хлоп: :хлоп: :хлоп:

Я пришел сюда только для того, чтобы предложить объединить плагин @jsmreese с moment js.

+1

+1

Поскольку похоже, что у @jsmreese мало времени, я отмечаю это как «В ожидании». По сути, предлагаемый PR должен реализовать всю функциональность плагина moment-duration-format @jsmreese , но должен соответствовать стилю ES2015, который сейчас используется в moment.js, и должен повторно использовать существующий момент. js для минимизации размера кода.

+1

Одной из функций, которой не хватает плагину форматирования момента времени @jsmreese , является возможность обратного построения объекта длительности из отформатированной строки.

привет @ mj1856 , мне интересно заняться интеграцией плагина формата в момент. как здесь работает вклад с лейблом Up-For-Grabs , должен ли я просто работать над этим и отправить PR в ветку develop , или кто-то другой заявил об этом?

@joshrowley это не заявлено, но ты будешь героем, если сделаешь это. Давай, возьми, а когда будешь готов, попробуй. Это будет немного сложнее, чем другие, поэтому, если вы хотите, не стесняйтесь отправлять запрос на вытягивание для проверки, прежде чем вы закончите — мы будем следить за этим. Мы будем разборчивы в том, чтобы не взорвать размер библиотеки с этим — он уже больше, чем нам хотелось бы. Пожалуйста, помните об этом.

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

В работе PR: #3308

Привет, ребята, я открыл PR в # 3615 и хотел бы увидеть его!

возможно, это связано с возникшими проблемами:
moment.duration(3500000).format("чч:мм", {forceLength: true})
который отображает результат: 58, а не 00:58

http://stackoverflow.com/questions/41443233/using-moment-js-to-display-duration-in-format-00xx-when-duration-is-less-than-a

ms = moment(moment().format(),"YYYY-MM-DD HH:mm:ss").diff(moment(time,"YYYY-MM-DD HH:mm:ss"));
var duration = moment.duration(ms);
moment(duration._data).format("HH:mm");

Еще один хак для форматирования длительности....

var timeInSeconds = 5000;
var formattedDur = moment("1900-01-01 00:00:00").add(timeInSeconds, 'seconds').format("HH:mm:ss");

+1

Обратите внимание, что хаки, опубликованные @fabiogalera и @befreestudios , похоже, хорошо работают при продолжительности < 24 часов, но ни один из них не работает при продолжительности более 24 часов.

EDIT: похоже, это связано с тем, что вы используете более старую версию moment. Я только что попробовал еще раз с последней версией, и она работает, как и ожидалось. Извините за путаницу.
-
Я также обнаружил некоторые странные ошибки округления/пограничные случаи с исходным хаком, опубликованным @mj1856 в верхней части этой темы. Например, попробуйте 2,3 или 4,1 часа. Это десятичные значения, которые должны делиться поровну на количество минут.

Например, 2.3 должно быть точно 2:18:00, но вы получите 2:17:59. А 4.1 должно быть ровно 4:06:00, а получится 4:05:59. Похоже, это связано с тем, что методы duration.asXXX() имеют некоторые проблемы с точностью/округлением. Кто-нибудь еще видел это и есть какие-либо предложения?

Вот моя функция для duration.format на основе Date.format(https://gist.github.com/ptquang86/2893903)

moment.duration.fn.format = moment.duration.fn.format || function (mask): string {
            // Some common format strings
            let formatMasks = {
                "default":      "DD MM YYYY HH:mm:ss",
                shortDate:      "M/D/YY",
                mediumDate:     "MM DD, YYYY",
                longDate:       "MM DD, YYYY",
                fullDate:       "DD, MM, YYYY",
                shortTime:      "H:mm TT",
                mediumTime:     "H:mm:ss TT",
                longTime:       "H:mm:ss TT Z",
                isoDate:        "YYYY-MM-DD",
                isoTime:        "hh:mm:ss",
                isoDateTime:    "YYYY-MM-DD'T'hh:mm:ss",
            };

            let format = function () {
                let token = /D{1,2}|M{1,2}|YY(?:YY)?|([HhmsTt])\1?|[LloSZ]|"[^"]*"|'[^']*'/g;

                function pad(val, len?) {
                    val = String(val);
                    len = len || 2;
                    while (val.length < len) val = "0" + val;
                    return val;
                }

                // Regexes and supporting functions are cached through closure
                return function (date, mask) {
                    mask = String(formatMasks[mask] || mask || formatMasks["default"]);

                    let D = date.days(),
                        m = date.months(),
                        y = date.years(),
                        H = date.hours(),
                        M = date.minutes(),
                        s = date.seconds(),
                        L = date.milliseconds(),
                        flags = {
                            D:    D,
                            DD:   pad(D),
                            M:    m + 1,
                            MM:   pad(m + 1),
                            YY:   String(y).slice(2),
                            YYYY: y,
                            H:    H % 12 || 12,
                            HH:   pad(H % 12 || 12),
                            h:    H,
                            hh:   pad(H),
                            m:    M,
                            mm:   pad(M),
                            s:    s,
                            ss:   pad(s),
                            l:    pad(L, 3),
                            L:    pad(L > 99 ? Math.round(L / 10) : L),
                            t:    H < 12 ? "a"  : "p",
                            tt:   H < 12 ? "am" : "pm",
                            T:    H < 12 ? "A"  : "P",
                            TT:   H < 12 ? "AM" : "PM",
                        };

                    return mask.replace(token, function ($0) {
                        return $0 in flags ? flags[$0] : $0.slice(1, $0.length - 1);
                    });
                };
            }();

            return format(this, mask);
        };

использовать: момент.длительность(10000).формат("чч:мм:сс:л")

+1

Есть новости, будет ли момент получить эту функциональность? Каков консенсус?

+1

Натыкаюсь опять это как 4-й проект, где я хотел использовать такую ​​функцию. Я надеюсь увидеть его реализованным в moment.js очень скоро.

+1

Я давно присматривался к этому, надеясь, что эта функция будет реализована. Ведется ли какая-либо работа по этому поводу?

Насколько я знаю, это работает прямо сейчас, у меня есть это в моем приложении, проверьте документы:
https://momentjs.com/docs/#/длительности/

@luchillo17 Вы говорите о длительности, вообще, работает?

Ну, я только что попробовал 5 минут назад, и это сработало.

Ну, просто хотел прояснить, о чем мы здесь говорим. Продолжительность _do_ работы. Эта проблема связана с форматированием продолжительности.

Плохо, нить такая большая, что я потерялся на пути вниз.

Однако теперь, когда я присмотрелся, в документации есть плагин для форматирования длительности момента:
https://momentjs.com/docs/#/plugins/duration -format/

Это то, на что вы, ребята, надеетесь? похоже, что у него даже есть определения типов TypeScript.

И я проверил это, работает довольно хорошо.

Плагин работает очень хорошо. Хотелось бы, чтобы он был объединен с Moment.js. Я не вижу, как длительности полезны без этого.

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

Я даже удивлен, что весь модуль длительности не находится в плагине.

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

Может быть, но не думать о том, что математика - это то, для чего хороши библиотеки, проверенные в бою решения, чтобы вам и мне не приходилось тратить время на такие задачи, например, я не знал, что существует так много стандартов длительности, например ISO 8601, модуль продолжительности позаботится об этом за меня, поэтому мне не нужно знать, как определяется этот стандарт.

Полагаю, что так.
В любом случае, я предлагаю сослаться на плагин в документации.
Таким образом, люди знают, что функциональность есть, и им не нужно обращаться в Google и искать эту функциональность.

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

Прошло 4 года, а реакции владельцев до сих пор нет... Печально :(

Привет народ,

Это то, над чем мы все еще работаем. «Момент» — волонтерское сообщество! Нам нужно убедиться, что такая функция имеет следующие свойства:
1) работает в любой среде
2) не добавляет слишком большого объема коду
3) не изобретает велосипед (т.е. для этого уже есть плагин!)
4) не нарушает существующие функции

Возможно, в какой-то момент это сольется.
https://github.com/момент/момент/тянуть/3615

Если вы считаете, что документация может лучше указать на плагин форматирования длительности (или другие плагины!), отправьте нам PR здесь: https://github.com/moment/momentjs.com/

@марвахаха

не добавляет слишком большого объема коду
не изобретает велосипед (т.е. для этого уже есть плагин!)

Что ж, поскольку в библиотеке моментов уже есть плагин формата длительности и длительность, может быть, лучшим решением будет вынести длительность из moment.js в отдельный плагин, а затем реализовать все «тяжелые» вещи внутри этого плагина?
При этом будут достигнуты 2 цели:
1) уменьшить размер moment.js
2) предоставить продолжительность непосредственно с наиболее полезными функциями вместо очень ограниченной версии.

Одна большая проблема заключается в том, что форматирование длительности будет очень сложно реализовать во всем диапазоне локалей, которые поддерживает moment.js.

Я бы не хотел, чтобы эти локали потеряли поддержку с ограниченным сроком действия, которая у них есть в настоящее время, или чтобы Moment добавил функцию, которая правильно работает только в некоторых локалях. Сохранение форматирования длительности в плагине кажется хорошей промежуточной точкой, которая гарантирует, что «ядро» moment.js стабильно и работает для всех, в то же время предоставляя пользователям с одной локалью возможность использовать плагины, которые выполняют функции, специфичные для их локали. .

Плагин форматирования длительности уже существует и упоминается в документации. Это более чем достаточно.

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

@ luchillo17 Я читаю всю документацию, прежде чем работать с чем-либо. Наверное, это только я.

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

@ luchillo17 Документация не виновата в том, что вы занимаетесь программированием, ориентированным на управление. Ваше здоровье!

Для тех, кто следит за сагой о форматировании длительности моментов, я опубликовал версию 2.0.0 моего плагина форматирования моментов.

Новая версия решает/включает в себя почти все проблемы, и отзывы о версии 1 за последние четыре года были в дикой природе, включая поддержку локализации и множественного числа, а также некоторые полезные параметры форматирования.

Проверьте это здесь: https://github.com/jsmreese/moment-duration-format/releases

Настоящий MVP -> @jsmreese

Ха. Спасибо за добрые слова, @OogieBoogieInJSON.

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

Опубликована версия 2.1.0.
https://github.com/jsmreese/формат-момент-длительность/релизы

В обновленной версии исправлено несколько проблем версии 2.0, а также представлена ​​новая функция moment.duration.format для координированного форматирования нескольких длительностей. Не путать с уже существующим moment.duration.fn.format .

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

moment.duration.format([
    moment.duration(1, "second"),
    moment.duration(1, "minute"),
    moment.duration(1, "hour")
], "d [days] hh:mm:ss");
// ["0:00:01", "0:01:00", "1:00:00"]

moment.duration.format([
    moment.duration(1, "minute"),
    moment.duration(1, "day")
], "w [weeks], d [days], h [hours], m [minutes], s [seconds]", { trim: "all" });
// ["0 days, 1 minute", "1 day, 0 minutes"]

@jsmreese 2.0 раньше приводил к некоторым ошибкам, поэтому мне пришлось заблокировать его на 1.3.0 для безопасности, тем не менее спасибо за то, что поддерживаете функцию / проект.

@prusswan , пожалуйста, попробуйте версию 2.1.0. Я хотел бы знать, если вы все еще видите эти ошибки!

Я опубликовал версию 2.2.0 формата момента-длительности, которая теперь включает функцию резервного числового формата, поскольку toLocaleString не полностью реализована во многих средах.

https://github.com/jsmreese/формат-момент-длительность/релизы

Я тестировал новую версию с помощью BrowserStack на ряде устройств Android с версиями ОС от 2.2 до 7 и на ряде устройств iOS с версиями ОС от 4.3 до 11. Также тестировалось на Chrome, Firefox, IE 8-11, и браузеры Edge.

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

Спасибо всем, кто зарегистрировал проблемы с версией 2 этого плагина!

После реализации версии 2 плагина формата момента-длительности есть некоторые очевидные улучшения для версии 3.

Я перечислил свои идеи ниже и добавил их как задачи в репозиторий . Если у вас есть идеи или комментарии о том, что вы хотели бы видеть, пожалуйста, дайте мне знать!

Будем надеяться, что следующая версия будет опубликована где-то через 4 месяца... а не через 4 года ожидания версии 2.

  • Параметры локализации форматирования резервных чисел должны быть включены в расширения объекта Moment Locale, которые я уже сделал для локализации меток единиц длительности. Это поместит всю конфигурацию локализации в одно место.

  • формат момента-длительности и его резервная функция форматирования чисел не следуют тому же API, что и Number#toLocaleString для значащих цифр и цифр фракции. Резервную функцию следует обновить, чтобы использовать API toLocaleString , а подключаемый модуль должен отображать параметры API toLocaleString напрямую, а не скрывать некоторые параметры и маскировать их за precision и Варианты useSignificantDigits .

  • Предоставление функции форматирования резервных чисел, а также функции тестирования функций toLocaleString упростит тестирование и позволит использовать их вне контекста длительности форматирования.

  • Добавьте определения типов для поддержки TypeScript, опубликуйте пакет NuGet и поддержите любые другие варианты упаковки, используемые в наши дни. (Это не должно ждать до версии 3.)

  • Тестирование плагина должно быть модернизировано, в идеале, чтобы оно соответствовало тестовой настройке Moment.js. (Это также не должно ждать до версии 3.)

@jsmreese Огромная работа, но я совершенно не чувствую необходимости дважды поднимать основную версию за короткий промежуток времени. Если он все еще используется после 4 лет без обновлений, то, вероятно, он достаточно хорош. Я чувствую, что эту текущую проблему можно закрыть, поскольку уже есть решение (используйте плагины). Можно начать новую проблему, чтобы решить, должна ли эта функциональность стать частью самого момента.

@jsmreese Удивительно. Большое спасибо и как раз вовремя! Огромная сделка для меня и спасибо за все, что вы делаете.

См. https://momentjs.com/docs/#/ -project-status/

Спасибо за все обсуждения здесь.

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