将秒数转换为天,小时,分钟和秒

时间:2016-03-19 07:07:02

标签: javascript

我有一个带有停止按钮的无限循环的Javascript计时事件。

单击开始按钮时会显示数字。现在我希望将这些数字转换为4小时3分50秒



var c = 0;
var t;
var timer_is_on = 0;

function timedCount() {
  document.getElementById('txt').value = c;
  c = c + 1;
  t = setTimeout(function() {
    timedCount()
  }, 1000);
}

function doTimer() {
  if (!timer_is_on) {
    timer_is_on = 1;
    timedCount();
  }
}

function stopCount() {
  clearTimeout(t);
  timer_is_on = 0;

}

$(".start").on("click", function() {
  //var start = $.now();
  //alert(start);
  //console.log(start);
  doTimer();
  $(".end").show();
  $(".hide_div").show();
});
$(".end").on("click", function() {
  stopCount();
});

.hide_div {
  display: none;
}

.end {
  display: none;
}

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<p class="start">Start</p>
<p class="end">End</p>
<p class="hide_div">
  <input type="text" id="txt" />//display numbers eg 12345
</p>
&#13;
&#13;
&#13;

如何将123456等数字转换为1天,4小时,40分钟,45秒?

10 个答案:

答案 0 :(得分:22)

像这样使用MathparseInt中的第二个参数是基数,这是可选的

&#13;
&#13;
var seconds = parseInt(123456, 10);

var days = Math.floor(seconds / (3600*24));
seconds  -= days*3600*24;
var hrs   = Math.floor(seconds / 3600);
seconds  -= hrs*3600;
var mnts = Math.floor(seconds / 60);
seconds  -= mnts*60;
console.log(days+" days, "+hrs+" Hrs, "+mnts+" Minutes, "+seconds+" Seconds");
&#13;
&#13;
&#13;

您的指定时间1234561 days, 10 Hrs, 17 Minutes, 36 Seconds而不是1 days, 4 Hrs, 40 Minutes, 45 Seconds

答案 1 :(得分:18)

我建议这样做!:

function secondsToDhms(seconds) {
seconds = Number(seconds);
var d = Math.floor(seconds / (3600*24));
var h = Math.floor(seconds % (3600*24) / 3600);
var m = Math.floor(seconds % 3600 / 60);
var s = Math.floor(seconds % 60);

var dDisplay = d > 0 ? d + (d == 1 ? " day, " : " days, ") : "";
var hDisplay = h > 0 ? h + (h == 1 ? " hour, " : " hours, ") : "";
var mDisplay = m > 0 ? m + (m == 1 ? " minute, " : " minutes, ") : "";
var sDisplay = s > 0 ? s + (s == 1 ? " second" : " seconds") : "";
return dDisplay + hDisplay + mDisplay + sDisplay;
}

答案 2 :(得分:3)

// countdown(3546544) -> 41d 1h 9m 4s
// countdown(436654) -> 5d 1h 17m 34s
// countdown(3601) -> 1h 0m 1s
// countdown(121) -> 2m 1s
const countdown = (function () {
    const pad = t => {
        return (t + '').length < 2 ? pad('0' + t + '') : t ;
    }
    return s => {

        const d = Math.floor(s / (3600 * 24));

        s  -= d * 3600 * 24;

        const h   = Math.floor(s / 3600);

        s  -= h * 3600;

        const m = Math.floor(s / 60);

        s  -= m * 60;

        const tmp = [];

        (d) && tmp.push(d + 'd');

        (d || h) && tmp.push(h + 'h');

        (d || h || m) && tmp.push(m + 'm');

        tmp.push(s + 's');

        return tmp.join(' ');
    }
}());

答案 3 :(得分:2)

我的map()和reduce()解决方案:

while factor * factor <= current_number:

如果您致电const intervalToLevels = (interval, levels) => { const cbFun = (d, c) => { let bb = d[1] % c[0], aa = (d[1] - bb) / c[0]; aa = aa > 0 ? aa + c[1] : ''; return [d[0] + aa, bb]; }; let rslt = levels.scale.map((d, i, a) => a.slice(i).reduce((d, c) => d * c)) .map((d, i) => ([d, levels.units[i]])) .reduce(cbFun, ['', interval]); return rslt[0]; }; const TimeLevels = { scale: [24, 60, 60, 1], units: ['d ', 'h ', 'm ', 's '] }; const secondsToString = interval => intervalToLevels(interval, TimeLevels);,则可以获得“ 1d 10h 17m 36s”

答案 4 :(得分:2)

针对该线程中建议的一些解决方案提出了我自己的变体。

if (!Number.prototype.secondsToDHM) {
    Number.prototype.secondsToDHM = function() {
        const secsPerDay = 86400;
        const secsPerHour = 3600;
        const secsPerMinute = 60;

        var seconds = Math.abs(this);
        var minus   = (this < 0) ? '-' : '';
        
        var days    = Math.floor(seconds / secsPerDay);
        seconds     = (seconds % secsPerDay);
        var hours   = Math.floor(seconds / secsPerHour);
        seconds     = (seconds % secsPerHour);
        var minutes = Math.floor(seconds / secsPerMinute);
        seconds     = (seconds % secsPerMinute);

        var sDays    = new String(days).padStart(1, '0');
        var sHours   = new String(hours).padStart(2, '0');
        var sMinutes = new String(minutes).padStart(2, '0');

        return `${minus}${sDays}D ${sHours}:${sMinutes}`;
    }
}

var a = new Number(50000).secondsToDHM();
var b = new Number(100000).secondsToDHM();
var c = new Number(200000).secondsToDHM();
var d = new Number(400000).secondsToDHM();

console.log(a);
console.log(b);
console.log(c);
console.log(d);

答案 5 :(得分:0)

你可能会发现使用纪元时间戳更简单:详见Convert a Unix timestamp to time in JavaScript,基本方法如下:

                    <script>

                     // Create a new JavaScript Date object based on the timestamp
                            // multiplied by 1000 so that the argument is in milliseconds, not seconds.
                            var date1 = new Date();

                            alert ('easy trick to waste a few seconds...' + date1);


                            // var date = date2 - date1;

                            // Hours part from the timestamp
                            var hours1 = date1.getHours();
                            // Minutes part from the timestamp
                            var minutes1 = "0" + date1.getMinutes();
                            // Seconds part from the timestamp
                            var seconds1 = "0" + date1.getSeconds();



                            var date2 = new Date();

                            // Hours part from the timestamp
                            var hours2 = date2.getHours();
                            // Minutes part from the timestamp
                            var minutes2 = "0" + date2.getMinutes();
                            // Seconds part from the timestamp
                            var seconds2 = "0" + date2.getSeconds();



                            // Will display time in 10:30:23 format
                            // var formattedTime = hours + ':' + minutes.substr(-2) + ':' + seconds.substr(-2);


                            var  elapsedHrs = hours2 - hours1;
                            var  elapsedMin = minutes2.substr(-2) -minutes1.substr(-2);
                            var elapsedSec = seconds2.substr(-2) - seconds1.substr(-2);                                

                            var elapsedTime = elapsedHrs + ' hours, ' + elapsedMin + ' minutes, ' + elapsedSec + ' seconds';

                            alert ('time between timestamps: ' + elapsedTime);

                    </script>

请注意,此脚本需要一些工作,因为现在它会为date1 = 12:00:00和date2 = 12:00:05之类的内容提供负值,但我现在就把它留给你。 您应该重写代码以在计时器开始时采用时间戳(var x = new Date();),并在完成/想要检查已用时间时使用时间戳,并在解析经过的秒,分钟之前减去两个小时等等。

答案 6 :(得分:0)

此答案以Andris' approach为基础,但是如果不存在较小的单位,则不会出现逗号结尾。

仅当truthy时,它也从此答案中借用处理连接数组值:

https://stackoverflow.com/a/19903063

我不是javascript的上帝,这可能是过度设计的可怕,但希望可读性和正确性!

function sformat(s) {

    // create array of day, hour, minute and second values
    var fm = [
        Math.floor(s / (3600 * 24)),
        Math.floor(s % (3600 * 24) / 3600),
        Math.floor(s % 3600 / 60),
        Math.floor(s % 60)
    ];

    // map over array
    return $.map(fm, function(v, i) {

        // if a truthy value
        if (Boolean(v)) {

            // add the relevant value suffix
            if (i === 0) {
                v = plural(v, "day");
            } else if (i === 1) {
                v = plural(v, "hour");
            } else if (i === 2) {
                v = plural(v, "minute");
            } else if (i === 3) {
                v = plural(v, "second");
            }

            return v;
        }

    }).join(', ');

}

function plural(value, unit) {

    if (value === 1) {
        return value + " " + unit;
    } else if (value > 1) {
        return value + " " + unit + "s";
    }

}


console.log(sformat(60)); // 1 minute
console.log(sformat(3600)); // 1 hour
console.log(sformat(86400)); // 1 day
console.log(sformat(8991)); // 2 hours, 29 minutes, 51 seconds

如果您需要用言语更“随意地”传达持续时间,还可以执行以下操作:

var remaining_duration = sformat(117);
// if a value is returned, add some prefix and suffix 
if (remaining_duration !== "") {
    remaining_duration = "about " + remaining_duration + " left";
}
$(".remaining_duration").text(remaining_duration);

// returns 'about 1 minute, 57 seconds left'

答案 7 :(得分:0)

这是我的解决方案,一个简单的函数可以四舍五入到最接近的秒!

var returnElapsedTime = function(epoch) {
  //We are assuming that the epoch is in seconds
  var hours = epoch / 3600,
      minutes = (hours % 1) * 60,
      seconds = (minutes % 1) * 60;
  return Math.floor(hours) + " hours, " + Math.floor(minutes) + " minutes, " + Math.round(seconds) + " seconds";
}

答案 8 :(得分:0)

我已经调整了Andris发布的https://stackoverflow.com/users/3564943/andris

代码
            // https://stackoverflow.com/questions/36098913/convert-seconds-to-days-hours-minutes-and-seconds
        function app_ste_36098913_countdown_seconds_to_hr(seconds) {
            seconds = seconds || 0;
            seconds = Number(seconds);
            seconds = Math.abs(seconds);

            var d = Math.floor(seconds / (3600*24));
            var h = Math.floor(seconds % (3600*24) / 3600);
            var m = Math.floor(seconds % 3600 / 60);
            var s = Math.floor(seconds % 60);
            var parts = new Array();

            if (d > 0) {
                var dDisplay = d > 0 ? d + ' ' + (d == 1 ? "day" : "days") : "";
                parts.push(dDisplay);
            }

            if (h > 0) {
                var hDisplay = h > 0 ? h + ' ' + (h == 1 ? "hour" : "hours") : "";
                parts.push(hDisplay)
            }

            if (m > 0) {
                var mDisplay = m > 0 ? m + ' ' + (m == 1 ? "minute" : "minutes") : "";
                parts.push(mDisplay)
            }

            if (s > 0) {
                var sDisplay = s > 0 ? s + ' ' + (s == 1 ? "second" : "seconds") : "";
                parts.push(sDisplay)
            }

            return parts.join(', ', parts);
        }

答案 9 :(得分:0)

我通过 Svetoslav 进一步调整了代码如下:

function convertSecondsToReadableString(seconds) {
  seconds = seconds || 0;
  seconds = Number(seconds);
  seconds = Math.abs(seconds);

  const d = Math.floor(seconds / (3600 * 24));
  const h = Math.floor(seconds % (3600 * 24) / 3600);
  const m = Math.floor(seconds % 3600 / 60);
  const s = Math.floor(seconds % 60);
  const parts = [];

  if (d > 0) {
    parts.push(d + ' day' + (d > 1 ? 's' : ''));
  }

  if (h > 0) {
    parts.push(h + ' hour' + (h > 1 ? 's' : ''));
  }

  if (m > 0) {
    parts.push(m + ' minute' + (m > 1 ? 's' : ''));
  }

  if (s > 0) {
    parts.push(s + ' second' + (s > 1 ? 's' : ''));
  }

  return parts.join(', ');
}