Разница между двумя датами в удобочитаемом формате - PullRequest
0 голосов
/ 11 декабря 2018

У меня есть объект, который представляет разницу во времени между датой и временем (я использовал Luxon):

{days: -0, hours: -15, minutes: -38, months: -0, seconds: -46.389, years: -0}

, и я хочу напечатать эту информацию в удобочитаемом виде.Итак, в данном случае:

difference is 15 h, 38 min, 46 s

Итак, я бы не считал числа равными 0, а результат должен быть отсортирован по годам, месяцам, дням, часам, минутам, секундам.Какой умный способ сделать это?

Ответы [ 2 ]

0 голосов
/ 11 декабря 2018

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

function formatPeriod(obj) {
  return ['years','months','days','hours','minutes','seconds'].reduce((acc, key) => {
    let v = parseInt(Math.abs(obj[key])); 
    if (v != 0) acc.push(v + ' ' + key.slice(0,key=='minutes'?3:1));
    return acc;
  }, []).join(', ');
}

// Example
var data = {days: -0, hours: -15, minutes: -38, months: -0, seconds: -46.389, years: -0};
console.log(formatPeriod(data));
0 голосов
/ 11 декабря 2018

вы можете использовать что-то вроде этого

function toReadable(obj) {
    var names = {
        days: "d", hours: 'h', minutes: 'min', months: 'm', seconds: 's', years: 'y'
    }
    return Object.keys(obj).reduce((acc, v) => {
        if(obj[v] != 0) acc.push(Math.abs(Math.ceil(obj[v])) + ' ' + names[v]);
        return acc;
    }, []).join(', ')
}
...