格式化时间算法

时间:2017-07-11 19:22:57

标签: javascript algorithm

我真的很难解决人类可读的持续时间格式算法。我已经解决了大部分问题,但总有一些错误我暂时无法解决。有些测试通过,有些则没有。请帮帮我解决它。

代码

function formatDuration (seconds) {
  // Complete this function
  var minutes = Math.round(seconds / 60);
  var thisSeconds = Math.round(seconds % 60);
  var hours = Math.round(seconds / 3600);
  var days = Math.round(seconds / 86400);
  var years = Math.round(seconds / 31536000);

  var stringYear = "year";
  var stringDay = "day";
  var stringHour = "hour";
  var stringMinute = "minute";
  var stringSecond = "second";

  if (years > 1) {
    stringYear = "years";  
  } else if (days > 1) {
    stringDay = "days";
  } else if (hours > 1) {
    stringHour = "hours";
  } else if (thisSeconds > 1) {
    stringSecond = "seconds";  
  } else if (minutes > 1) {
    stringMinute = "minutes"; 
  }

  if (minutes >= 60) {
    hours = Math.round(minutes/60);
    minutes = Math.abs(minutes - hours*60);

    if (minutes > 1) {
      stringMinute = "minutes"; 
    }
  } 

  if (hours >= 24) {
    days = Math.round(hours/24);
    if (days > 1) {
      stringDay = "days";  
    }
    hours = hours - days*24;
    stringHour = "hours";
  }

  if (days > 365) {
    days = Math.abs(days - years*365);
    stringDay = "days";
  }

  var obj = new Map();
  obj.set(stringYear, years);
  obj.set(stringDay, days);
  obj.set(stringHour, hours);
  obj.set(stringMinute, minutes);
  obj.set(stringSecond, thisSeconds);

  var empArr = [];

  obj.forEach(function (value, key, mapObj) {

    if (value == 0) {
      obj.delete(key);   
    }

    var res = value + " " + key;

    if (value > 0) {

      empArr.push(res);

      formatStrings(empArr);

    }

  }); 

  return formatStrings(empArr);

}

function formatStrings(arr) {
    return arr.length == 1 ? arr[0] : arr.slice(0, arr.length - 1).join(", ") + " and " + arr[arr.length - 1];
    //console.log(str);
}


formatDuration(3600);

测试结果

enter image description here

1 个答案:

答案 0 :(得分:1)

Math.round执行舍入(如果值大于.5则向上舍入)。 在任何地方使用Math.floor来截取部分。

我也会使用modulo来避免你添加的所有复杂逻辑。 所以

var minutes = Math.round(seconds / 60);

会变成

var minutes = Math.floor(seconds / 60) % 60;

等等。