【问题标题】:Convert ticks to time format (hh:mm:ss)将刻度转换为时间格式 (hh:mm:ss)
【发布时间】:2012-12-30 06:49:23
【问题描述】:

我从网络服务器获取视频长度值作为滴答声。我想以“hh:mm:ss”格式显示它。如何在 JavaScript 中做到这一点?

【问题讨论】:

  • 你能举例说明你得到的输入吗?
  • 正常除以 60 不行吗?
  • 由于媒体“刻度”有许多不同的大小,codesequoia.wordpress.com/2008/11/30/…,需要更多信息才能对这个问题给出明确的答案。在这种情况下,我会对实际的刻度大小非常感兴趣。

标签: javascript html time


【解决方案1】:

假设刻度以秒为单位(如果不是,您可以先将它们转换为秒),您可以通过查找时间跨度中的整分钟和小时数来获得所需的格式,然后取剩余的秒数. modulo 运算符在这里很有用,因为一小时是 3600 秒,一分钟是 60 秒:

function displayTime(ticksInSecs) {
    var ticks = ticksInSecs;
    var hh = Math.floor(ticks / 3600);
    var mm = Math.floor((ticks % 3600) / 60);
    var ss = ticks % 60;

    alert( pad(hh, 2) + ":" + pad(mm, 2) + ":" + pad(ss, 2) );
}

function pad(n, width) {
    var n = n + '';
    return n.length >= width ? n : new Array(width - n.length + 1).join('0') + n;
}

请参阅this answer 了解如何在 JS 中用前导零填充数字(上述方法源自此答案)。

【讨论】:

  • 看起来这个脚本假设滴答声以秒为单位。
  • 视频长度有多种刻度尺寸,例如codesequoia.wordpress.com/2008/11/30/… 秒(这是假设的)通常不是其中之一,因为这太粗略了。
  • 问:假设是秒,最后一行不能是var ss = ticks % 60;吗?
  • @TrueBlueAussie 在这种情况下可以安全地假设秒是合适的单位,因为 OP 接受了答案。由于它显示为“hh:mm:ss”,我假设秒是可用的(因为这是显示格式的精度)。不过,推测 OP 可能想要什么是无关紧要的,因为这成功了。对于您的第二个问题:ticks % 60 不起作用,因为这会重复计算 hhmm 变量已经占用的秒数。
  • 假设任何事情都是不安全的,并且没有陈述任何假设。 1 tick == 1 秒是非常不寻常的。 OP更有可能使用这个答案作为指导并自己进行转换。回复% 60:从什么时候开始模数运算符“双重计数”?它只是除以每分钟秒数后的剩余秒数:)
【解决方案2】:

这是一个老问题,但我对任何答案都不满意。

这里有3个问题:

  • 将刻度大小转换为秒
  • 从持续时间(以秒为单位)中提取小时、分钟和秒
  • 将数字格式化为 2 位数字

第 1 部分 - 蜱

媒体come in many durations 的刻度大小,因此需要做出一些假设才能回答问题。

由于所需的答案是以秒、分钟和小时为单位的,因此第一步是将“tick”值转换为秒。

 seconds = ticks / tickspersecond

例如,如果刻度以毫秒为单位,那么转换将是

 seconds = ticks / 1000

第 2 部分 - 提取小时、分钟和秒

  • hour = seconds / secondsperhour => hour = seconds / 3600
  • minute = seconds / secondsperminute modulus minutesperhour => minute = (seconds / 60) % 60)
  • second = seconds modulus secondsperminute => second = seconds % 60

第 3 部分 - 格式化

  • 有多种方法可以设置数字前导零的格式,这一种将使用此示例特有的简单函数(最多 2 位数字)。

例如

function pad2(number){
   number = '0' + number;
   return number.substr(number.length - 2);
}

注意:由于浮点错误,您需要将 Math.floor 应用于小时和分钟值。如果要缩短主代码,可以将Math.floor 放入pad2 函数中。

最终答案变成:

// Assume milliseconds for now
var seconds = ticks / 1000; 
var hour = Math.floor(seconds / 3600);
var minute = Math.floor((seconds / 60) % 60);
var second = seconds % 60;

var result = pad2(hour) + ':' + pad2(minute) + ':' + pad2(second)

注意:为了演示,我在小时显示中添加了% 24 (modulus hoursperday),因为自 1971 年以来的小时数是一个“大”数字 - 因此不会格式化为小数点后 2 位 :)

JSfiddle 演示: https://jsfiddle.net/TrueBlueAussie/x2s77gzu/

或者如果您想将Math.floor 放入pad2 https://jsfiddle.net/TrueBlueAussie/x2s77gzu/1/

【讨论】:

    【解决方案3】:

    假设刻度是 javascript 格式(自 1970 年 1 月 1 日午夜以来的毫秒数):

    var date = ticks.toISOString(); // gives e.g. 2015-10-06T16:34:23.062Z
    var time = date.substring(11,19);  // 16:34:23
    

    http://www.w3schools.com/jsref/jsref_toisostring.asp

    编辑:

    【讨论】:

    【解决方案4】:

    您需要以下代码:

    //define ticks
    var ticks = {...};
    
    //get seconds from ticks
    var ts = ticks / 1000;
    
    //conversion based on seconds
    var hh = Math.floor( ts / 3600);
    var mm = Math.floor( (ts % 3600) / 60);
    var ss = (ts % 3600) % 60;
    
    //prepend '0' when needed
    hh = hh < 10 ? '0' + hh : hh;
    mm = mm < 10 ? '0' + mm : mm;
    ss = ss < 10 ? '0' + ss : ss;
    
    //use it
    var str = hh + ":" + mm + ":" + ss;
    console.log(str);
    

    【讨论】:

    • 问:假设是毫秒,ss的计算不能只是var ss = ts % 60;吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-17
    • 2016-12-02
    • 1970-01-01
    • 1970-01-01
    • 2015-10-11
    相关资源
    最近更新 更多