2

Input: seconds, Output: grammatically correct, formatted time (with words spelled out).

So far I managed to get as far as going from say 40044373 to 1 year, 98 days, 5 hours, 37 minutes, 1 second - note the correct plurals and commas.

What I'm missing is an "and" that is added instead of the last comma (of course only when there's enough inputs). For example 1 year and 1 second for input 31556953 instead of my current 1 year, 1 second in that case.

function formatDuration (seconds) {

var numyears = Math.floor(seconds / 31556952);
if (numyears > 1) {var pluryears = " years, "} else {var pluryears = " year, "};
if (numyears > 0) {var printyears = numyears + pluryears;} else {var printyears = ''};

var numdays = Math.floor((seconds % 31556952) / 86400);
if (numdays > 1) {var plurdays = " days, "} else {var plurdays = " day, "};
if (numdays > 0) {var printdays = numdays + plurdays;} else {var printdays = ''};

var numhours = Math.floor(((seconds % 31556952) % 86400) / 3600);
if (numhours > 1) {var plurhours = " hours, "} else {var plurhours = " hour, "};
if (numhours > 0) {var printhours = numhours + plurhours;} else {var printhours = ''};

var numminutes = Math.floor((((seconds % 31556952) % 86400) % 3600) / 60);
if (numminutes > 1) {var plurminutes = " minutes, "} else {var plurminutes = " minute, "};
if (numminutes > 0) {var printminutes = numminutes + plurminutes;} else {var printminutes = ''};

var numseconds = (((seconds % 31556952) % 86400) % 3600) % 60;
if (numseconds > 1) {var plurseconds = " seconds"} else {var plurseconds = " second"};
if (numseconds > 0) {var printseconds = numseconds + plurseconds;} else {var printseconds = ''};

return(printyears + printdays + printhours + printminutes + printseconds)
}

formatDuration(31556953);
4

5 回答 5

3

一个更紧凑的解决方案,可以按预期输出时间字符串:

function formatDuration (seconds) {
  var values = {
    years: Math.floor(seconds / 31556952),
    days: Math.floor((seconds % 31556952) / 86400),
    hours: Math.floor(((seconds % 31556952) % 86400) / 3600),
    minutes: Math.floor((((seconds % 31556952) % 86400) % 3600) / 60),
    seconds: (((seconds % 31556952) % 86400) % 3600) % 60,
  };
  var withUnits = Object.keys(values)
  .filter(function(unit) { return values[unit] > 0; })
  .map(function (unit) {
    var value = values[unit];
    return value + ' ' + (value === 1 ? unit.slice(0, -1) : unit);
  });
  return (withUnits.length > 1 ? withUnits.slice(0, -1).join(', ') + ' and ' : '') + withUnits.pop();
}

console.log(formatDuration(40044373));
于 2016-08-16T20:45:33.737 回答
1

我正是为此目的编写了一个小型库:

https://github.com/adamshaylor/compound-subject

在您的情况下,您可以像这样使用它:

var formattedTimeString = compoundSubject([
    numyears + 'years',
    numdays + 'days',
    numhours + 'hours',
    numminutes + 'minutes',
    numseconds + 'seconds'
]).make();

产生类似的东西:

2年5天3小时10分2秒

您还可以通过调用添加牛津逗号delimitAll()

于 2016-08-25T22:21:25.037 回答
1

只是一个替换最后一个逗号的小正则表达式:

return (printyears + printdays + printhours + printminutes + printseconds)
    .replace(/, (.*)$/, " and $1");
于 2016-08-16T20:22:33.493 回答
1

不相关,但呈现的代码很难思考。

我将复数位提取到它自己的方法中,大致:

function pluralize(dur, s) {
  var ret = false;

  if (dur > 0) {
    ret = dur + ' ' + s;

    if (dur > 1) {
      ret += 's';
    }
  }

  return ret;
}

然后主线代码,而不是手动做所有事情,推送到一个数组上,例如,

function formatDuration(seconds) {
  var segments = [];

  var years  = Math.floor(seconds / 31556952)
    , sYears = pluralize(years, 'year')
    ;

  if (sYears) { 
    segments.push(sYears); 
  }

  // etc.

您只需要对seconds值进行特殊处理:

  var seconds = (((seconds % 31556952) % 86400) % 3600) % 60
    , sSeconds = pluralize(seconds, 'second')
    ;

  var tmp = segments.join(', ');
  if (!sSeconds) {
    return tmp;
  }

  return tmp + ' and ' + sSeconds;
}

这可以进一步清理,但会产生如下输出:

1 year, 2 hours, 46 minutes and 43 seconds
1 year and 3 seconds

(虽然我更喜欢牛津逗号。)

我仍然会做的事情:

  • 停止重新计算一切;记录剩余的秒数。
  • 将数组传递到函数中,避免在主线代码中进行人工操作。
    • (或者以其他方式将其包装起来。)

https://gist.github.com/davelnewton/a137186​​7527c5f1530498e1555e2fb0a

于 2016-08-16T20:41:49.163 回答
0

您只需要在退货中添加“和”即可。

return(printyears + printdays + printhours + printminutes + 'and' + printseconds)

并删除此行上“分钟”后的逗号

if (numminutes > 1) {var plurminutes = " minutes "} else {var plurminutes = " minute "};
于 2016-08-16T20:23:23.573 回答