javascript 如何将持续时间格式化为XX小时和YY分钟

63lcw9qa  于 2023-03-11  发布在  Java
关注(0)|答案(4)|浏览(148)

我有一个以分钟为单位的给定持续时间,例如100分钟、140分钟。
我需要以“XX小时YY分钟”格式显示它们。
例如:
我更喜欢用date-fns或普通的JS来做这件事。
谢谢

r1zhe5dt

r1zhe5dt1#

要将以分钟为单位的持续时间转换为“XX小时和YY分钟"格式,可以使用以下算法:
通过将持续时间(分钟)除以60并取结果的整数部分来计算持续时间中的小时数。例如,如果持续时间为140分钟,则小时数为140/60 = 2。
从总持续时间中减去小时数后,通过取上一除法的余数来计算剩余分钟数。例如,如果持续时间为140分钟,并且我们已经计算出有2小时,则剩余分钟数为140%60 = 20。
使用以下模式设置结果的格式:“XX小时YY分钟"。如果没有小时,则省略“小时”部分。如果没有分钟,则省略“分钟”部分。例如,如果持续时间为140分钟,则结果应为“2小时20分钟”。
此算法的示例程序:

function formatDuration(duration) {
  const hours = Math.floor(duration / 60);
  const minutes = duration % 60;
  if (hours === 0) {
    return `${minutes} minute${minutes !== 1 ? 's' : ''}`;
  } else if (minutes === 0) {
    return `${hours} hour${hours !== 1 ? 's' : ''}`;
  } else {
    return `${hours} hour${hours !== 1 ? 's' : ''} and ${minutes} minute${minutes !== 1 ? 's' : ''}`;
  }
}

console.log(formatDuration(1)); // output: 1 minute
console.log(formatDuration(100)); // output: 1 hour and 40 minutes
console.log(formatDuration(141)); // output: 2 hours and 21 minutes
zpjtge22

zpjtge222#

一个简单的解决方案

const totalMinutes = 140;

const minutes = totalMinutes % 60;
const hours = (totalMinutes - minutes) / 60

const s1 = `${totalMinutes} => ${hours} hour${hours>1?'s':''} and `
const s2 = `${minutes} minute${minutes>1?'s':''}`
console.log(hours>0?s1+s2:s2)

你在格式上自相矛盾

1.您引用了"XX hours and YY minute(s)",但在示例中使用了一位数。
1.假设您想要“小时”,而不是“小时”的多个小时?

sq1bmfud

sq1bmfud3#

不需要date-fns,也不需要任何用于这种方式的库。
您的浏览器支持使用i18 n格式设置时间、日期和持续时间。

const divMod = (n, m) => [Math.floor(n / m), n % m];

const createDurationFormatter = (locale, unitDisplay = 'long') => {
  const
    timeUnitFormatter = (locale, unit, unitDisplay) =>
      Intl.NumberFormat(locale, { style: 'unit', unit, unitDisplay }).format,
    fmtHours = timeUnitFormatter(locale, 'hour', unitDisplay),
    fmtMinutes = timeUnitFormatter(locale, 'minute', unitDisplay),
    fmtList = new Intl.ListFormat(locale, { style: 'long', type: 'conjunction' });
  return (minutes) => {
    const [hrs, mins] = divMod(minutes, 60);
    return fmtList.format([
      hrs ? fmtHours(hrs) : null,
      mins ? fmtMinutes(mins) : null
    ].filter(v => v !== null));
  }
};

let durationFormatterEn = createDurationFormatter('en-US');
console.log(durationFormatterEn(1));  // 1 minute
console.log(durationFormatterEn(100)) // 1 hour and 40 minutes
console.log(durationFormatterEn(141)) // 2 hours and 21 minutes

let durationFormatterEs = createDurationFormatter('es-US');
console.log(durationFormatterEs(1));  // 1 minuto
console.log(durationFormatterEs(100)) // 1 hora y 40 minutos
console.log(durationFormatterEs(141)) // 2 horas y 21 minutos

let durationFormatterEn2 = createDurationFormatter('en-US', 'short');
console.log(durationFormatterEn2(1));  // 1 min
console.log(durationFormatterEn2(100)) // 1 hr and 40 min
console.log(durationFormatterEn2(141)) // 2 hr and 21 min
.as-console-wrapper { top: 0; max-height: 100% !important; }

一个更强大的解决方案是要求毫秒,并格式化为天:
一个二个一个一个

sulc1iza

sulc1iza4#

以下是我的版本。

function amountToTimeFormat(minutes) {
  const _hours = Math.floor(minutes / 60);
  const _mins = minutes % 60;
  
  let resHour = _hours.toString().padStart(2, '0');
  let resMin = _mins.toString().padStart(2, '0');
  
  resHour = resHour > 0 ? resHour+' Hrous':'';
  resMin = resMin > 0 ? resMin+' minutes':'';
  return `${resHour} ${resMin}`;
}

console.log(amountToTimeFormat(60))
console.log(amountToTimeFormat(141))
console.log(amountToTimeFormat(100))

相关问题