Как добавить ведущие нули к результату вычисления разницы дат с помощью moment.js?

Одна из прелестей библиотеки moment.js — это то, как она справляется с иногда 366 днями в году ;-) и разной продолжительностью месяцев.

Итак, я собрал следующий фрагмент кода:

<script src='https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.10.3/moment.js' type='text/javascript'></script>
<script type="text/javascript">

Date.getFormattedDateDiff = function(date1, date2) {
  var b = moment(date1),
      a = moment(date2),
      intervals = ['years','months','weeks','days','hours','minutes','seconds'],
      out = [];

  for(var i=0; i<intervals.length; i++){
      var diff = a.diff(b, intervals[i]);
      b.add(diff, intervals[i]);
      out.push('<div>' + diff + ' ' + intervals[i] + '</div><br/>');
  }
  return out.join(' ');
};

window.onload = function calculateInterval() {
   var start = moment("2013-09-04"),
       end   = moment();

   document.getElementById('output').innerHTML  
     = 'Time elapsed between "' + start.toISOString().split('T')[0]
     + '" and "' + end.toISOString().split('T')[0] + '":<br/><br/>' 
     + Date.getFormattedDateDiff(start, end);
}
</script>

<p><label id="output"></label></p>

Codepen можно найти здесь...

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

Любые предложения о том, как получить начальные нули в результате, поэтому 07 лет вместо 7 лет и т. Д. Высоко ценятся.


person Piotr Linski    schedule 07.03.2021    source источник
comment
100+ лет также должны быть дополнены 0, т.е. 0100?   -  person syduki    schedule 08.03.2021
comment
нет, это не нужно.   -  person Piotr Linski    schedule 08.03.2021


Ответы (2)


Простой оператор if для добавления 0 будет работать — значение typeof diff() возвращает number, и вам нужно преобразовать его в строку для управления.

Date.getFormattedDateDiff = function(date1, date2) {
  var b = moment(date1),
      a = moment(date2),
      intervals = ['years','months','weeks','days','hours','minutes','seconds'],
      out = [];

  for(var i=0; i<intervals.length; i++){
      var diff = a.diff(b, intervals[i]);
      b.add(diff, intervals[i]);
      if (diff.toString().length == 1) {
        diff = "0" + diff.toString();
      }
      out.push('<div>' + diff + ' ' + intervals[i] + '</div><br/>');
  }
  return out.join(' ');
};

window.onload = function calculateInterval() {
   var start = moment("2013-09-04"),
       end   = moment();

   document.getElementById('output').innerHTML  
     = 'Time elapsed between "' + start.toISOString().split('T')[0]
     + '" and "' + end.toISOString().split('T')[0] + '":<br/><br/>' 
     + Date.getFormattedDateDiff(start, end);
}

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

person mr_joncollette    schedule 07.03.2021
comment
Первоначально я искал решение, которое использует что-то вроде момента (дата). формат ('ММ/ДД/ГГГГ'). Однако ваше прагматичное решение работает отлично. Так что со мной все в порядке. Большое спасибо! - person Piotr Linski; 08.03.2021
comment
К сожалению, moment(end).diff(start) выводит миллисекунды unix в виде числа. moment(value).format("YY-MM-DD HH:mm:ss") форматирует его правильно в соответствии с тем, что вы ищете, но предполагает, что вы вводите необработанную дату в миллисекундах, и переходит к (19) 77-07-05 05:09:30, хотя мой ввод .format, вероятно, неверен - person mr_joncollette; 08.03.2021

В вашем случае вы должны обрабатывать это вручную, потому что вы выводите необработанные числа. Один из способов сделать это — использовать метод padStart

diff.toString().padStart(2, '0')

Но это не будет работать в старых браузерах, см. https://caniuse.com/?search=padStart для поддержки браузера.

Вместо этого вы могли бы написать что-то вроде этого

function getLeadingZeroNum(num) {
    return num < 10 ? '0' + num : num;
}

getLeadingZeroNum(4) // 04;
person t1m0n    schedule 07.03.2021
comment
Не знал о padStart()! - person mr_joncollette; 08.03.2021