时间转换:Coderbyte 上的 JavaScript 函数

3

我正在Coderbyte上挑战,希望能获得有关我的问题的任何建议:

我知道有一种更简单的方法来解决这个问题(后来我找到了):

function TimeConvert(num) { 
  var hours = Math.floor(num / 60);  
  var minutes = num % 60;
  return hours + ":" + minutes; 
  } 

...所以TimeConvert(123);将会是2:3

我知道我的答案更复杂,但是为什么我尝试回答这个问题的方法不起作用?我错过了什么?它只返回0:00对于任何输入的数字:

function TimeConvert(num) { 
    var hours=0;
    var minutes=0;

    for(var i=0; i<=num; i+=60) {//loop through number every 60
        if(num[i]>=60) { //for every 60 add 1 hour
            hours+=1;
        }else if(num[i]<60){
            minutes=num[i];
        }
    }

  var newMinute=0;
    if (minutes<10){
            newMinutes="0"+minutes;
        }else if(minutes>10){
            newMinutes=minutes;
        }

    return(hours + ":" + newMinutes);          
}

感谢大家!^^

你的问题在于你没有使用Date()对象进行日期时间计算。虽然JavaScript中有相关方法,但你却通过循环和其他复杂的方式来实现已有的功能。你可以从这里开始:http://www.techrepublic.com/article/manipulate-time-and-date-values-with-javascripts-date-object/ 如果这对你来说太复杂了,你可以使用Moment.js库,它可以让日期时间处理更加简单。http://momentjs.com - Marcos Pérez Gude
@MarcosPérezGudem 我认为那不是问题。请查看我下面的回答。 - void
@MarcosPérezGudem 我知道解决这个问题有更简单的方法,但我对JavaScript还很陌生。我想找出如何用我目前的思路创建一个解决方案。我相信这将有助于我作为开发人员长期发展,并帮助我练习解决问题的能力。 :) - Mar
@MarcosPérezGudem *想要而不是曾经。 - Mar
3个回答

2

您为什么要使用num[i]>=60?您只需检查num>=60num<60即可。num[i]始终是未定义的值,而num不是字符串。(如果它是字符串,则num[i]将打印与该索引对应的字符。)因此,您需要比较num而不是num[i]

    function TimeConvert(num) { 
    var hours=0;
    var minutes=0;
    var times = num;
    for(var i=0; i<times; i+=60) {//loop through number every 60
        if(num>=60) { //for every 60 add 1 hour
            hours+=1;
            num -= 60;
        }else if(num<60){
            minutes=num;
        }
    }

  var newMinute=0;
    if (minutes<10){
            newMinutes="0"+minutes;
        }else if(minutes>10){
            newMinutes=minutes;
        }

    return(hours + ":" + newMinutes);          
}

console.log(TimeConvert(123));

Updated Fiddle


感谢@void解决了num问题。我对num和num[i]感到困惑,你为我澄清了一些我已经知道但还没有掌握的东西。但即使我应用了这个更改,函数仍然不能正常工作。我找出了问题并提供了两种解决方案。^^ - Mar
@Masha 我认为这个函数运行良好:http://jsfiddle.net/voidSO/L5g4fbcf/. - void
实际上,当您输入123时,它会显示3:00。应该是2:03。 - Mar
@Masha 哦,是的,请检查更新后的答案和更新后的 fiddle :) - void
这是同一个链接吗?因为我得到了相同的答案。 - Mar

1

谢谢!我实际上想出了两种解决方法。首先,我应该迭代1次,而不是60次,在第一个if语句中,我需要每次迭代减去60,如下所示:

function TimeConvert(num) { 
    var hours=0;
    var minutes=0;

    for(var i=0; i<=num; i++) {
        if(num>=60) { //for every 60 add 1 hour
            hours+=1;
            num-=60;//makes sure that the loop goes every 60
        }else if(num<60){
            minutes=num;
        }
    }

//以下内容对于Coderbyte来说并不必要,仅为样式原因而添加。第二个答案同理。
    var newMinute=0;
    if (minutes<10){
            newMinutes="0"+minutes;
    }else if(minutes>10){
            newMinutes=minutes;
    }

//写下分钟数,而不是newMinutes(对于Coderbyte)。第二个答案也是如此。

  return(hours + ":" + newMinutes); 
  }

我已经想到了如何使用while循环实现这个:

function TimeConvert(num) { 
    var hours=0;
    var minutes=0;
    var newMinutes=0;

    while(num>=60) {
        hours+=1;
        num-=60;
    }

    if(num<60){
      minutes=num;
    }

    if (minutes<10){
      newMinutes="0"+minutes;
    }else if(minutes>10){
      newMinutes=minutes;
    }

    return(hours + ":" + newMinutes);          
}

1

除了使用 Math.floor() 进行一行返回语句外,您还可以包含 ES6 模板字面量

function TimeConvert(num) { 
  return `${Math.floor(num/60)}:${num%60}`; 
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接